干净整洁代码(Clean Code)的本质是什么? - mariocervera


当我们听到“整洁代码”一词时,通常会想到由罗伯特·C·马丁(Robert C. Martin)(也称为鲍勃大叔、鲍勃大爷)撰写的著名书籍:“整洁代码:敏捷软件工艺手册”(2009年)
自从本书出版以来,“整洁代码”一词已经越来越流行。今天,它的含义受到鲍勃大叔的异象的强烈影响,但这并不意味着该术语在书出版之前从未使用过。
我认为,在本书出版之前,开发人员确实使用了“整洁代码”一词。我还相信,开发人员自然会将术语与易于阅读和维护的代码相关联。
可读性和可维护性是软件的理想属性;但是,它们并没有给我们深刻的印象,即什么是整洁的代码。这就是为什么我想更深入地研究。除了可读性和可维护性的基本属性之外,我还想讨论干净整洁代码的本质。
如果从更深层次看,您会发现干净整洁的代码是主观的。例如,您可以将一段C ++代码视为不可读,因为您不熟悉语法,但是经验丰富的C ++程序员可能会不同意。
鲍伯大叔在他的书中意识到了干净代码的主观性:
“它的定义可能与程序员一样多”。
该声明激发了我撰写此博客文章的兴趣。我想分享干净的代码对我来说意味着什么。我想回答“干净代码的本质是什么?”这个问题。即使有很多专家已经比我做过的更好地回答了这个问题。
 
1.干净的代码读起来就像一本好小说。
当代码干净时,您应该能够坐在舒适的沙发上,在火炉旁,喝一杯美酒,在昏暗的灯光下享受代码,就像欣赏自己喜欢的小说一样。
您可能会认为这是一种夸张,并且您是对的,但是程度比您想象的要小。阅读干净的代码绝对应该很有趣,因为名字可以显示意图并告诉您一个故事。因为流程微不足道;因为陈述是如此简单明了,以至于它们在您的视线中滑动;因为您必须使用的灰色单元格数量很少。
简洁的代码告诉您一个引人入胜且易于遵循的故事。


 
2.干净的代码很简单。
简洁的代码是如此简单,以至于无法使作者看起来聪明。但是,很明显,该代码是由努力的人编写的。
因为简单不容易。
您的第一次尝试并没有实现简单性。首先,使代码正常工作,必要时忽略最佳实践。然后,您进行重构,以使代码易于读取和维护。
首先,使它起作用。然后,您做对了〜肯特·贝克。
 
3.干净的代码可测试。
上一节的必然结果是,如果不进行重构,就无法编写干净的代码。而且,要成功重构,您需要自动测试以确保行为不会改变。因此,您需要测试以编写干净的代码。
此外,自动化测试是代码保持干净的方式。
今天的代码有多干净都没关系。如果没有测试,您将无法自信地进行重构。因此,代码将变得不干净,因为随着时间的流逝,代码往往会变得更加混乱和耦合。
重构和测试可以帮助您抵消这种趋势。
代码的自然趋势不是朝着干净整洁方向发展。相反。应对这种趋势需要采取明确的行动。

4.干净的代码重点突出。
简而言之,用几句话就能完成一件事,并且做得很好。
编写者不会使读者负担过多不必要的细节。目的很明确。没有歧义。它没有意外和意外的副作用。
如果调用“ isPrinterReady”,则知道该功能将仅检查打印机是否已准备就绪,不会无意中删除文件。
干净的代码按其说的做,没有意外的变化。
 
5.干净的代码不会重复
干净的代码说了一切。
这并不意味着可以盲目地消除重复。干净的代码避免了过早的抽象,并且知道,如果两个相同的代码段代表不同的知识,则消除重复会带来风险。
干净的代码遵循DRY原理,但是它承认DRY是关于知识重复而不是代码。
 
6.干净的代码讲的是问题,而不是解决方案。
如果您的代码中的名称包含计算机风格的词语(例如“ DTO”),则它可能专注于“如何”。
干净的代码专注于“什么”。
干净的代码使用的术语侧重于问题域,而不是计算机上的特定解决方案。
这些术语处于正确的抽象级别。如果软件模块在域层中,则代码将使用域模型的术语。如果模块在数据库层中,它将谈论数据库。
干净的代码使用正确的抽象级别来讨论要解决的问题。 
 
 
7.干净的代码密切关注细节。
在编写简洁的干净代码时,您会正确地获取详细信息,并且不会做出任意决定。如果您声明一个受保护的字段,您就会知道为什么不将其声明为私有。如果声明了动态数组,就会知道为什么静态数组不会更好。每个细节都很重要。
在干净的代码中,错误代码和异常是有意义的。错误处理是明确的;名称是一致的;没有内存泄漏;等等
在软件开发中,细节至关重要。干净的代码可以识别这个事实。
 
8.干净的代码没有坏气味。
当您看到难闻的代码时,重构是明智之举,因为设计异味通常是深层质量问题的征兆。
干净的代码不会发出气味,或者,如果有发出,则气味很微弱。

  • 干净的代码不是严格的。很容易改变。
  • 干净的代码不是固定不变的。您可以轻松地重用它。
  • 干净的代码不是不透明的。意图很容易理解。
  • 干净的代码并不脆弱。您可以更改它而不会引入错误。

如果发臭,请改一下〜肯特·贝克。
 
结论
在(希望)更深入地了解什么是干净的代码之后,您可能会想知道:我为什么要编写干净的代码?
对我而言,主要原因是代码被读取的次数远远超过其编写的次数。因此,以快速阅读为代价而偏爱快速写入的解决方案效率低下。
例如,可能仅由于需要调用该方法并持有对该接口的引用而将一种方法添加到一个接口中,但这可能会使该接口的内聚性降低并且难以理解。
始终考虑您的行动的后果。不要在迈向干净代码的过程中退后一步。
快速前进的唯一方法就是身体健康〜Bob大叔。
 
我对软件公司的卑鄙建议:
不再寻找油漆刷的专家,而将精力集中在寻找优秀的画家上。将精力集中于寻找可以编写干净代码的软件工程师。这就是您快速并以可持续的步伐前进的方式。如果要敏捷,就必须注意技术卓越。如果编写肮脏的代码,您将无法敏捷。