因此,如果您想快速走,如果要快速完成,如果您希望代码易于编写,请易于阅读。 Robert C. Martin
通常,有两种类型的程序员聪明的人和专业人士。他们俩都可以完成工作,但是两者之间存在很多差异。专业人士知道,清晰度是国王。他们利用自己的力量来编写其他人可以通过编写干净的代码来理解和处理它的清洁代码。但是,干净的代码到底是什么?它的特征是什么?如何编写干净的代码?当我开始阅读Robert C. Martin撰写的Clean Code时,这些都是我的问题,很高兴这本书根本不让我失望。这本书有很多清洁代码的收获,我认为每个程序员都应该阅读它,尤其是在他们的职业生涯开始时。
在本文中,我们将学习
-
变量名称应揭示其意图,并且不应包括数据类型
-
类和函数名称应该分别为名词和动词
-
函数应只做一件事,参数的数量应为最小
-
应尽可能避免评论
-
链接在一起的代码的一部分应彼此相邻
-
应该以阅读时的眼球应为最少的格式
本文中的所有代码都是用Python编写的,因此,如果您不熟悉该语言,则可能对您有些抽象。
干净代码的特征?
罗伯特·马丁(Robert C.根据他们,这里是干净代码的一些特征。
我喜欢我的代码优雅和高效。逻辑应该很简单,以使错误很难隐藏。干净的代码做得很好。 bjarne stroustrup (C ++的发明者)
可以读取清洁代码,并由开发人员除原始作者以外的其他开发人员增强。它具有单位和接受测试。它有有意义的名字 dave Thomas
干净的代码简单而直接。干净的代码读取如写得好的散文 - * Grady booch *(用应用程序的分析和设计的作者)
所以,如果我概述了这些特征,则干净的代码应为
-
优雅:应该简单易懂。它应该让您在阅读时微笑。
-
聚焦:每个功能/模块都应暴露出一心一意的态度。它只能专注于完成一件事情。
-
测试:如果它没有测试,那么无论它多么优雅/可读。
编写干净的代码
有意义的名字
如果一个名称需要评论,则该名称不会揭示其意图。 鲍勃叔叔
名称很重要,因为它们揭示了目的。想出好的名字需要时间,但请相信我值得,因为它节省了时间,我们必须以后阅读/概述。
变量名
它应该在没有任何评论的情况下描述其性质,如果没有任何评论,则应更改名称。即
即使在语言的编码约定中允许使用数据类型,该数据类型也不应成为变量名称的一部分。尤其是在变化定义时的Python中,我们没有设置数据类型。如果我们在某个时候更改变量的数据类型,则会引起问题,因为我们必须用新的数据类型替换它。让我们看看下面的示例
将上述变量更改为浮点非常忙碌,因为我们必须在任何地方替换它。但是,它在*Hungarian notation*中允许,但现在不建议使用它,Microsoft也不建议使用此表示法。 (reference)
变量名称应发音。正如鲍勃叔叔所说的那样,如果您可以发音,则可以在不听起来像个白痴的情况下讨论它。好吧,在这里,在这里,在这里,三个cee ennteeâ(bcr3cnt)我们有一个pee es ges es gess zeekyewâ(pszq)int,请参阅?
也应该可以搜索一个名称,为此,更长的名称优于较短的名称。另外,单个字符名称不应用于大范围。它仅应在较短的范围中使用,例如小功能/环。
功能和班级名称
函数名称应该是动词,它也应与值一起揭示动作,例如 extract_age,delete_user_info。 *另一方面,班级名称不应是动词。它应该是名词或名词短语名称。即 *客户,帐户和Weatherrecord。
不要通过添加不必要的上下文来为自己困难。除非它们代表不同的上下文,否则每个类/功能都不会有每个类/功能。例如,在绿色披萨小屋的应用中,每个功能/类都以gph的方式将每个功能/班级前缀真的很糟糕,因为会有很多冗余字符。据清楚,较短的名字更好。
可爱
如果您很可爱,这对您来说很好,但是请不要使代码变得可爱,使其变得相当专业。我知道以您的宠物或最喜欢的角色名称命名变量听起来很可爱,但是在地球上,一个人可以知道什么是气泡 dexter
在命名变量,函数或类的同时,不使用lang语。例如,不使用 merk() nee kill()。
每个概念一个单词
选择一个概念并坚持下去。例如,我们不应使用 *获取,检索,提取 *和 *获取作为函数名称 *的不同类别的概念。很难记住哪个类具有哪个函数名称。以同样的方式,在代码库中拥有 *管理器 *,因为两者都有相同的目的。
功能
功能应该做一件事。他们应该做得好。他们只能做到。
大小在函数上确实很重要,功能的第一个规则是它应该很小,然后应该小于它。
做一件事
如果做不止一件事,编写功能就没有优势。由于编写功能的主要目的是将更大的概念分解为一个下一个抽象级别的一组步骤。功能不足以容纳嵌套结构。同样,功能的缩进水平不应大于一两个。它将使该功能更容易阅读和理解。
上面的功能,即使不是很长,也做了不止一件事。循环之前的块应是一个单独的函数。
鲍勃叔叔提到了一种知道一个函数的方法多于一件事的方法是,如果您可以从中提取另一个功能,而不仅仅是对其实现的重新介绍。
争论
函数的论点不得超过三个论点。理想的参数应该为零。更多的论点具有更多的概念力量。较少数量的参数使编写测试用例更容易。
标志论点很丑陋。将布尔人传递到功能上是一种真正可怕的做法。它立即使该功能的签名复杂化,并大声宣称该功能可以做不止一件事。如果标志为trug,则它会做一件事,如果标志为false。
。评论
没有什么比放置良好的评论更有帮助。没有什么比传播谎言和错误信息的古老的肮脏评论那样如此的破坏。 鲍勃叔叔
评论总是失败。我们之所以拥有它们,是因为我们不能总是弄清楚没有它们的情况,但是它们的使用不是庆祝的原因。评论的目的不应解释意图。我们编写一个模块,我们知道它令人困惑和混乱。我们知道这很混乱。因此,我们对自己说, - 我最好评论!不!您应该最好清洁它!
以下代码中有两种方法;带有评论的混乱代码来解释它,其他是干净的代码,可以解释自己,没有任何评论。
因此,当您可以使用变量/功能时,请勿使用注释。
不幸的是,我们,程序员,没有现实地维护评论。需求发生了变化,代码也从这里和那里移动,但评论一直在那里移动,并造成了混乱和误解。不应有评论的代码或位置标记。当位置标记共同聚集一定功能时,很少有很少见,但通常应该将它们删除。
下面给出了位置制造商的示例。
*# Actions #######*
好评论
并非所有评论都不好,有时需要添加评论。例如,出于法律原因,最好在文件开始时添加版权评论,作者身份。添加后果和发表评论的警告也很合理。
有时评论不仅仅是有关实施的有用信息,还提供了编写此代码的原因。例如,在下面的示例中,开发人员表示添加下载延迟的原因。
格式化
代码格式很重要。忽略忽略太重要了,宗教对待很重要。
源文件应该像报纸文章。该文件名应该很简单,但有意义,以告诉我们我们是否在正确的文件中,而不是像报纸文章的标题一样。由于文章的开始给出了文章的摘要,并且随着我们的进展,详细信息的增加。以相同的方式,高级概念应位于文件的顶部,并且随着我们的发展,详细信息应增加。低级功能/详细信息应在文件的末尾。
垂直格式
应该通过单个空白行将类似的逻辑线与其他线分开。空白行是一个视觉提示,可以识别一个新的单独的概念。
就像添加空白线将概念分开一样,垂直密度意味着紧密的关联。紧密相关的代码线应彼此相邻。因为如果您试图为函数/变量的定义找到一条继承链,这是非常令人沮丧的,花了时间和精力才能找到和记住零件的位置。
如果一个函数调用另一个功能,则应垂直关闭,如果可能的话,呼叫者应在callee上方。亲和力越强,垂直距离越少。这使程序具有自然流程。另外,应将变量声明尽可能接近其用法。
水平格式
我们使用水平的空白将密切相关的事物关联并拆分相关的事物。我们围绕着带有空白的任务操作员,以突出它们。这些空间使分离很明显。但是我们没有在功能名称和开放括号之间放置空间。这是因为功能及其参数密切相关。
在Python中,我们还可以将比较,数学和布尔运算符与单个空间包装,但是如果单行中有多个运算符,那么我们将运算符与优先级较低。下面给出了一个示例。
以下几行不受干净的代码的启发,而是我在职业生涯中学到的东西。在我职业生涯的开始时,我的团队负责人和老年人经常告诉我,在代码审查时将一条线分成多个,反之亦然。那时,我对这种分裂和合并感到困惑,但随后我的团队负责人解释了这种“眼球”的效果,然后对我来说很有意义。
一条线的大小应接近其相邻线的长度。因此,在阅读代码时,应尽可能最小化眼球。它会使阅读更加容易。
例如,在下面的代码中,尺寸长度不接近其相邻行
在这里进行的眼球应最小化,下面给出了重构代码。
因此,总而言之,这是您的收获:
-
变量名称应有意义,明显,可搜索并应揭示其意图。数据类型不应该是其中的一部分。
-
班级名称应该是一个名词,并且对其中的事物有清晰的描述。
-
函数名称应该是动词,只做一件事,不要太长。
-
函数应具有最少的参数。
-
评论可以写作是解释您要完成的事情的绝对最后方法,应该很好地考虑。
-
链接在一起的代码的一部分应彼此格式化。
-
代码应尽可能少的眼球。
如果您有一些疑问或对此的看法,请通过LinkedIn与我联系。
快乐的清洁编码