不是我吓唬你,写不出这种代码,那就等着被leader开除吧

被开除了?因为代码不规范?新人都注意一下! 事情是这样的: 昨天早上,我们部门的一个实习生被劝退(开除)了,导火索是因为他写的代码太烂了,不是说实现不了需求,而是这代码实在是太NM难看了,他师傅(我同事)找不着他人,亲自去调试想改一下代码,结果花了近3个小时也没调试出来。 . 估计这代码也就那个实习生自己看得懂,我也看了一下,真的是不堪入目,头皮发麻,最后我这个苦逼的同事只能自己去加班再写。 . 然后第二天实习生就被人事找去谈话,收拾东西走人了。 大家刚开始学习Python的时候,肯定被告诫过写代码一定要规范。但是很多人不以为然,觉得自己看得懂就 阅读详情

迪迦早期精彩文章(希望对大家有所帮助,直接点击即可阅读):

华为大神珍藏版:SpringBoot全优笔记,面面俱到太全了

涨薪60%!从小厂逆袭,坐上美团L8技术专家(附面经+心得)

专科出身,2年进入苏宁,5年跳槽阿里,论我是怎么做到的?

就离谱?最新Java架构师全路线总结+高频面试题,这也太强了吧!

阿里大佬倾情力荐:Java全线成长宝典,从P5到P8一应俱全!

前言

在我们平时刷题的时候,你可能会写过很多诸如

int a,b,c
int [] arrays=new int arrays[10];
if((numbers > 10 && flag == 'true') || flag =='false')

这种代码,对于我们自己练习编程或者解决一个算法题,当然没有问题。但是如果是在一个工程中,尤其是几十上百人维护了几年的工程中,还使用这种写法,倾泻自己天马行空的才华,保证leader不打死你哦。

所以,对于代码的整洁性,可读性,自古以来就有很多大神做出过总结,比如这本《clean code》,中文名叫做《代码整洁之道》,今天,我们就来看看吧。

不是我吓唬你,写不出这种代码,那就等着被leader开除吧

命名

命名思想

首先就是命名,命名可以说是一切程序的基础,如果用三个字来形容那就是——“有意义”。

你要做到,当一个人看到你的命名,就知道这个变量/函数是干什么的。

来看这一段代码:

public List<int[]> getThem() {
  List<int[]> list1 = new ArrayList<int[]>();
  for (int[] x : theList)
    if (x[0] == 4)
      list1.add(x);
  return list1;
}

这段代码非常简洁,但是非常模糊,我们不知道theList到底是什么,为什么x==4作为判断,list1又是什么?

现在我们来改一改:

public List<int[]> getFlaggedCells() {
  List<int[]> flaggedCells = new ArrayList<int[]>();
  for (int[] cell : gameBoard)
  if (cell[STATUS_VALUE] == FLAGGED)
  flaggedCells.add(cell);
  return flaggedCells;

复制代码

从上面的代码中,我们可以马上看出来,flaggedCells表达的是标致cell,而cell位于gameBoard中,就是一个游戏面板,只需要再通过文件名,知道这是一个【扫雷游戏】,那么cell就是每一个格子,if语句中就是判断每一个格子是否被点击过,如果是,就添加到flaggedCells中,我们显然知道他想要干什么——搜集玩家点击过的格子并返回。

但是,上面的代码吗使用的是 int 数组,比如int[] cell,每一个数组内部的数表示cell的状态,可是cell并不需要那么多状态,而且这样导致每次使用这个状态的时候都要重新定义数组,状态是cell的一个属性,所以,完全可以定义一个cell的类,将他的状态封装进入。

public List<Cell> getFlaggedCells() {
  	List<Cell> flaggedCells = new ArrayList<Cell>();
    for (Cell cell : gameBoard)
    if (cell.isFlagged())
    flaggedCells.add(cell);
    return flaggedCells;
}

这样子很清晰看出,gameBoard由Cell组成,从gameBoard中取出标记过的cell放入flaggedCells中,这样的代码是不是感觉浑然天成,自然而然呢?

命名规范

通过以上事例,你应该理解在写工程项目时,诸如数组,链表,字典这些底层结构应该要封装在User,Cell,Address这种类中,使用的时候直接使用这些类即可,这是一种大局观的思维,现在我们来做一些较为细节的落地规范。对于什么驼峰命名,匈牙利命名我相信你不会陌生,但是我在这里再强调两个地方。

  • 类名 类作为一个对象,需要的是名词或者名词短语,gameBoard,Ueser都是如此,不要使用模糊名词(就是概念很大的名词),比如Data,因为可以细分为UserData,MoneyData等,对于可以细分的模糊名词,一定要用名词短语。 类名都是第一个字母大写的名词组合。
  • 方法名 方法作为具体干事的执行者,当然是使用动词或者动词短语了,同样注意的是,不要使用模糊动词,和上面不一样的是,解决模糊名词的方法是增加名词修饰,而解决模糊动词的方法是【换更精准的动词】 比如getInformation,就不好,因为get太大了,你的information是pull过来的还是clone过来的?是被动接受的还是主动去取的?Information这个词也很模糊,所以可以根据情况拆分为直接取用户数据——fetchUserData,上传新数据再取用户数据——uploadAndfetchUserData。 不是不能用get,是说如果有更好的选择,尽量用更精准的动词。 注意方法名第一个字母小写。

函数

第一原则

短小

如果还有第二原则,那还是短小。

短小到什么程度,最多20~30行吧,

所以要求,一个函数,只做一件事情,

什么叫做只做一件事情呢?

就拿处理数据来说,我们说【处理用户数据】是一件事,你也可以说是做了三件事:

  1. 取数据
  2. 处理数据
  3. 返回数据

当然,这个例子有点抬杠的意思,不过反映的现实是,代码中各种逻辑往往你中有我,我中有你,到底一件事情的边界在哪里?

这个因人而异,我只能提出书中的方法。

  1. 同一抽象级 刚才那个取数据,就是在同一抽象级下完成的事情,就可以看做是一件事,如果再来一件——保存用户数据,显然,可以归到前面,还是一件事,如果再来一件——取车辆数据,显然,就是另外一个抽象的东西了。
  2. 分割判定与处理 这个好理解,就是立法与司法的分割,比如: if (set("username", "unclebob")) ... 复制代码就让人迷惑,他表达的意思是不是如果unclebob成功赋值给username就返回true呢?还是说如果username为null时就用unclebob 赋值进入呢?username到底是属性还是碰巧一个字符串叫做username呢?随便猜。 但是我们这样修改: if (attributeExists("username")) { setAttribute("username", "unclebob"); ... } 复制代码如果有username这个属性,就赋值,非常清晰,也就是说,判定与处理要分隔开。

你可能会说,对于像if,while,switch这种语句,往往动辄十几行,短不了啊!

首先,这个原则不是铁律,实在太长也没办法。

其次,对于这些语句,完全可以讲里面的逻辑做一个封装,比如这种:

public static String renderPageWithSetupsAndTeardowns(
  PageData pageData, boolean isSuite) throws Exception {
  if (isTestPage(pageData))
    includeSetupAndTeardownPages(pageData, isSuite);
  return pageData.getHtml();
}

if 语句之后做了一件
includeSetupAndTeardownPages的事情,不仅极大增强了可读性,而且代码短了不少。

关于参数

当你看jdk源码或者是android源码的时候,你会发现他们经常做调用,尤其是同名的方法重载,在看《算法》这本书的时候,也是,比如关于快速排序的:

public static void quickSort(int [] arrays){
  quickSort(arrays,0,arrays.length-1);
}
private static void quickSort(int [] arrays,int left,int right){
  ...
}

我在一开始接触的时候,觉得虽然好看,但未免麻烦,随着经验的提升,这是一种非常好的编程习惯。

首先,对于用户来说,他想要进行快排,想传的只有数组,左右边界都包含进去了,你为什么要他多传参数?同时第一个方法使用的是public,就表示这是暴露给用户的。

其次,第二个方法在第一个方法中被调用,用private保护了起来,避免了无数麻烦。

所以,越是业务层的逻辑,越要写参数少的代码,如果参数必须要很多,那就用一个private的函数封装起来,你让用户拥有一百个参数输入,对他来说,那不是自由,那是灾难。

苹果和微信的使用体验就是将这种哲学贯彻到极致的代表。

注释

最好的注释,就是代码本身。

用代码能解释清楚的事情,尽量少用注释,如果注释太多,只能证明代码写得烂……

不过有些地方还是有必要写代码的。

位置

最好写在方法顶部,不插入到实际代码中,比如那个面试几乎必问的String中的equals方法,源码如下:

 ... 
 * @see  #compareTo(String)
 * @see  #equalsIgnoreCase(String)
 */
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = length();
        if (n == anotherString.length()) {
            int i = 0;
            while (n-- != 0) {
                if (charAt(i) != anotherString.charAt(i))
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

警示的注释

这里可以写一些告诫他人的代码,让后来的接盘侠能够引起重视。

//When I wrote this, only God and I understood what I was doing
//Now, God only knows

简单说就是,下面的代码一定有用,但是我也看不懂了,你别碰O(∩_∩)O哈哈~

在知乎上看到还有这样的。

//如果这段报错,你在机器上装一个360安全卫士,相信我我
以为是开玩笑,结果装了就真的好了。这个是前人留给我的。
//这个服务有问题的话,你可以问某某某,这段是他写的。
这个是在我离职交接时写的,出卖了未离职的一个同事。
//执行成功后发送一条通知短信,稳定后注释掉
手机号是写死的,我看到这段的时候还没有注释,这一年每天凌晨他都能收到短信。

这些人水平怎么样另说,但是对于后人还是用心的。

TODO注释

这个就不说了,很常用。


看完了有用的注释,我们来看看没用的注释

多余的

// Utility method that returns when this.closed is true. Throws an exception
// if the timeout is reached.
public synchronized void waitForClose(final long timeoutMillis)
  throws Exception
  {
		if(!closed)
	{
  wait(timeoutMillis);
  	if(!closed)
  		throw new Exception("MockResponseSender could not be closed");
  }
}

这就是把代码做了什么又描述一遍,没有任何意义。

被注释掉的代码

InputStreamResponse response = new InputStreamResponse();
response.setBody(formatter.getResultStream(), formatter.getByteCount());
// InputStream resultsStream = formatter.getResultStream();
// StreamReader reader = new StreamReader(resultsStream);
// response.setContent(reader.read(formatter.getByteCount()));

相信很多人都有这样的行为,在自己写算法题的时候用来测一测没有任何问题,但是对于后来者来说,他该怎么办?

他一定会想:也许是有用的呢?不然为什么之前要写。

但是他又看不懂或者觉得没必要看,于是就留了下,然后这样的代码就会越来越多,最终成为传说中的祖传代码。

不用心

注释要清楚,如果注释还要写注释来解释,根本没有意义。

比如下面这个,为什么要用200?

/*
* start with an array that is big enough to hold all the pixels
* (plus filter bytes), and an extra 200 bytes for header info
*/
this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];

不是我吓唬你,写不出这种代码,那就等着被leader开除吧

小结

对于多数人来说,命名函数与注释基本上就是程序的主要组成部分,能够处理好这三样就能写出非常好的代码了,当leader看到你的提交的时候,看到的是如此优雅的代码,我想,他也会觉得是一种享受吧,就和诗歌一样。

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023 本文分享“占用网络”方案中,具有代表性的方法:OccNet。它以多视角视觉为核心,首先生成BEV特征,然后通过级联结构和时间体素解码器重建生成3D占用特征。构建一个通用的“3D占用编码特征”,用以表示3D物理世界。这样的特征描述可以应用于广泛的自动驾驶任务,包括检测、分割和规划。 阅读详情

相关推荐

翻倍密码系统主图指标-行情买卖以及持股-翻倍密码买点-获利了结,通达信炒股软件指标公式

华森制药,上图案例走势,低位出现“开始潜伏”信号,进场红色K线持股待涨,进入“翻倍密码买点”,开启紫色K线的持续上涨,目前也达到了翻倍行情,还没出现“获利了结”的出场信号。这套操盘系统,即便出现信号没走出翻倍行情,也都是可以全身而退,获利出局,或者微微止损出场,并不代表每一个波段都能翻倍,但是走翻倍行情,你按照信号参与或持仓是不会错过的。用这个操盘系统操作,你也不需要天天的盘中看盘,不需要担心盘中的震荡,只要趋势不变,哪怕是偶尔出现跌停,也不影响行情的继续上涨,这都是上涨途中的正常调整。

weixin_69760830的博客 3674

代码成诗之路,你需要了解的——命名,函数与注释规范

前言 在我们平时刷题的时候,你可能会写过很多诸如 int a,b,c int [] arrays=new int arrays[10]; if((numbers > 10 && flag == 'true') || flag =='false') 这种代码,对于我们自己练习编程或者解决一个算法题,当然没有问题。但是如果是在一个工程中,尤其是几十上百人维护了几年的工程中,还使用这种写法,倾泻自己天马行空的才华,保证leader不打死你哦。 所以,对于代码的整洁性,可读性,自古以来就有很

小松与蘑菇 1150

TRK-MPC5634M开发板实战:从硬件解析到CAN、ADC外设驱动调试

在嵌入式系统开发,尤其是汽车电子和工业控制领域,微控制器(MCU)是核心执行单元。其工作原理基于处理器内核、存储器和丰富的外设接口协同工作,通过软件编程实现对硬件的精确控制。这种技术价值在于能够为严苛环境提供可靠、实时的控制解决方案。典型的应用场景包括汽车车身控制、网关、电池管理系统以及工业自动化设备。本文聚焦于恩智浦(NXP)基于Power Architecture e200z0内核的汽车级MCU——MPC5634M,并以其官方评估板TRK-MPC5634M为平台,深入探讨其硬件设计逻辑、软件环境搭建及核

weixin_29997523的博客 288

高级工程师比普通开发者更容易被裁、AI/ML 岗大热,2023 技术人才报告发布!...

整理 | 屠敏出品 | 优快云(ID:优快云news)2023 年,程序员、技术人员就业情况究竟如何?近日,Linux 基金会发布了一份《2023 年科技人才状况报告》,研究了当前和未来的技术人员配置要求以及组织内所需的技能,揭晓了最新的现状。通过这份报告中,我们有一些精彩发现:由于对经济的担忧导致 59% 的组织修改其 2023 年的技术招聘计划,主要是冻结新的职位招聘,但更多的组织计划增加...

优快云资讯 1万+

飞牛NAS一键部署小雅Emby全家桶:解锁海量影音资源与智能刮削

本文详细介绍了如何在飞牛NAS上通过Docker一键部署小雅Emby全家桶,完美解决传统WebDAV挂载无法刮削元数据的问题。该方案整合了小雅Alist海量影音资源与Emby媒体服务器,通过预下载超百GB元数据包,自动实现海报、简介等信息的完美匹配,打造出精美的个人影音库。部署过程需准备阿里云盘令牌与充足存储空间,并详解了从环境配置、镜像拉取到最终验证的完整步骤及优化技巧。

weixin_28312391的博客 918

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1881

月入 3.6 万,代码写得太少被开除。。

点击关注公众号,Java干货及时送达转自:程序人生(ID:coder_life)程序员一天能写多少行代码?据优快云调查发现,大部分程序员平均每天会写200行左右的代码。那代码的数量能衡量一个程序员的水平吗?在此前的一起劳动争议案件中,一科技公司的算法工程师因为编程能力不足、试用期不合格被开除,其中一主要原因就是代码写的太少。图源:中国裁判文书网事件梳理原告:中科尚易健康科技(北京)有限公司被告:...

Java技术栈,分享最主流的Java技术 1090

Metal 一、初识 Metal 及其语言规范

游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。

irainsa的博客 1219

c语言作诗程序代码

char* Poem[] = {“晚来天欲雪”, “能饮一杯无”, “逝水似流年”, “落花如远征”, “寒风起苍翠”, “江波转玉砌”};char* Chengyu[] = {“河东狮吼”, “莫名其妙”, “铁杵成针”, “青出于蓝”, “大材小用”};// 0到5之间的随机数。// 0到4之间的随机数。

qq_32257509的博客 399

【行业解决方案篇十五】【DeepSeek物流优化:车辆路径规划算法】

写完这篇技术解析,突然想起那位多绕150公里的王师傅——现在他的车载平板会实时显示"路径健康度",当偏离最优路线超过5%就自动报警。从节约算法到深度强化学习,从三维装载到时序预测,这些技术最终化作每辆货车少烧的1升柴油,每个快递小哥早回家的1小时。最后说个浪漫的事:系统曾为某偏远山区规划出一条穿越枫叶林的配送路线,不仅节省23公里,还成了网红打卡路线。原来物流优化的尽头,不仅是冰冷的数学,还有人间烟火气的温度。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 292

部署OpenClaw时设置环境变量提示export: not valid in this context的完整解决方案

OpenClaw环境变量设置错误解决方案 问题概述 在部署OpenClaw时设置环境变量出现"export: not valid in this context"错误,通常由以下原因导致: 在非交互式shell中使用export命令 在命令替换或管道中使用export 脚本文件包含Windows换行符(CRLF) 解决方案 修正脚本执行方式:确保export命令在正确的shell上下文中使用 使用source命令:通过. setup_openclaw.sh或source setup_op

博客 457

代码逻辑是分方法写好 还是在一个方法写好_不是我吓唬你,写不出这种代码,那就等着被leader开除吧...

前言在我们平时刷题的时候,你可能会写过很多诸如int a,b,cint [] arrays=new int arrays[10];if((numbers > 10 && flag == 'true') || flag =='false')这种代码,对于我们自己练习编程或者解决一个算法题,当然没有问题。但是如果是在一个工程中,尤其是几十上百人维护了几年的工程中,还使用这种写法,...

weixin_39588223的博客 110

微信小程序 - 完美解决“code“:“NO_AUTH“,“message“:“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试“(微信小程序报错问题排查解决)

微信小程序NO_AUTH: 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试?微信小程序提示商户号该产品权限未开通,请前往商户平台>产品中心检查后重试,微信小程序"code":"NO_AUTH"错误码怎么解决,报错信息如下:httpResponseBody[{"code":"NO_AUTH","message":"商户号该产品权限未开通,请前往商户平台>产品中心检查后重试"}],微信小程序支付问题,如何解决这个问题,虚拟支付商户号,虚拟支付商户号里面没有产品支付的页面,排查商户号没问题,商户号配置

🏆 前端领域优质创作者 4444

C语言实现汉语作诗程序的代码

/ 生成随机数种子。“少年听雨歌楼上,就决定在吹风机前玩游戏。“东风夜放花千树,吹来论文泪满衣。“云淡风轻近午天,傻瓜饭盒别开伞。“锄禾日当午,喜洋洋下灶做饭。“大雪满弓刀,人人都望大疙瘩。/* 汉语诗句数组 *//* 生成诗句函数 */

qq_32257509的博客 437

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

代码写成这样,老板把我开除了| IT 巨能唠

今天聊一聊遇到过的一些神逻辑代码,不一定很全,但真心让小编我自叹不如啊!1、耍猴的最佳手段还记得 XX 手机的抢购活动么,抢购按钮的代码类似是这样的:<ahref...

优快云云计算 2295

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

当程序员写不出代码了,该怎么办?

原文出处: PAWEL KLIMCZYK   译文出处:码农网/小峰    你已经对着电脑 n 个小时了。敲键盘正成为一种负担,你在想,键盘是否是西西弗斯推着的那块巨石。 伯乐在线转注:西西弗斯是希腊神话中的人物,与更加悲剧的俄狄浦斯王类似,西西弗斯是科林斯的建立者和国王。他甚至一度绑架了死神,让世间没有了死亡。最后,西西弗斯触犯了众神,诸神为了惩罚西西弗斯,便要求他把一块巨石推上山顶,而由于...

weixin_34375233的博客 2876

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

程序员刚写完代码,就被开除了

学姐狂贴吧发现一个热帖,就凑了凑热闹~~~ 看到这样一个帖。一程序员说自己刚写完代码,就别公司老板给开除了。为什么会这样的呢? 原来是这位程序员写了一段这样的代码: public static Date getNextDay() {try {Thread.sleep(24*60*60*1000);} catch (InterruptrdException e) {e.printStackTrac...

zhuguang10的博客 2236

你想被开除吗?来看看程序员【离职小技巧】吧

这些年,我都是一步步掌握这些离职小技巧的,很不舍的分享给你

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 7万+

程序员写的代码bug超过十个就开除

某大型软件公司…… 领导:现在咱们研发部门有好几个项目组了,有上百名开发,需要评定大家的绩效。 HR:对,我觉得公司天天最闲散的就是他们,天天迟到,来了就对着电脑敲啊敲,别人不懂技术也不知道他们做的怎么样。 领导:就是就是,你看咱们就没有一个项目没延期过,要加强绩效考核! HR:从今天开始,我们以大家的代码行数为评定绩效的标准。 程序员们:代码行数,这好办啊,咱多来点换行,空行。能写成两行的绝不写...

Androidyuexia的博客 1595
上一篇: 太肝了!三个步骤让我一天就搞定了MySQL,顺利拿下了天猫offer!
下一篇: 九大核心专题,660页内容,熬夜23天吃透,我收割了3个大厂offer
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值