究竟什么是优秀的代码?Robert Martin的一句话可以完美诠释。
代码质量的唯一衡量标准是每分钟说多少次WTF
我来解释一下这句话。当我在做code review时,通常会有三种不同的感受:
所以当我们看代码时影响我们的第一印象的因素是什么呢?
这是一段整洁又漂亮的代码。
能够写出整洁又漂亮的代码是一个优秀工程师的标志。
It is Clean and Beautifully written code.
And writing clean and beautiful code is the mark of a GREAT softwarecraftsman.
要学会这项伟大的事业有两个关键点:知识和工作。
知识会教给你如何在变得更加专业的模式、原则、实践和启发式的方法。但这些知识需要你通过大量的读写、不断的实践和努力才能获得。
简而言之,学会如何写整洁的代码并非一件简单的事。你必须要为之付出努力,必须一次又一次的练习、发现问题、经历失败,直到正确处理为止。这一过程没有任何捷径。
下面我将向你介绍一些如何写出整洁且漂亮的代码的技巧。
Kendrick Lamar说过:
如果我要讲一个真实的故事,那么一定是从故事的命名开始。
If I’m gonna tell a real story, I’m gonna start with my name
命名会遍布代码的每一个角落,我们会为函数、类、参数、包等命名,还会为源文件、目录命名。总之,在写代码的过程中,好的命名可能是使代码变整洁的最重要的因素。
你的命名应该显示出你的意图。选择一个好的名称会耗费你的一些时间,但是如果随意命名,以后你会浪费更多的时间来理解它。所以请尽可能使你的命名更加合理,读你的代码的人也会因此感谢你。
你要谨记的是,变量、函数和类的命名应该能回答三个问题:它为什么存在、它是做什么的、它用在哪里。
这不仅需要良好的描述能力,还需要了解跨国界的文化背景。要教会你这些,没有人能比你自己更合适了。
我们所说的「单一责任」原则。
Louis Sullivan对此有过完美的描述
形式跟随函数
Form follows function.
每个系统都是由特定的编程语言构建而成。函数通常是动词,而类通常是名词。函数任何编程语言中通常都是出现在第一行,写出整洁代码的本质其实就是写出整洁的函数。
要想写出整洁的函数,首先应该遵循两条黄金法则:
这意味着你的函数不应该出现嵌套的结构。所以函数的缩进级别不应该大于一个或两个,这会让你的代码更容易阅读、理解和消化。除此之外,我们还需要确保函数中的语句都处于同一抽象级别。
在一个函数中如果混有不同的抽象级别通常会使代码变得十分混乱,并且难以管理。优秀的工程师会把函数当作给别人讲的一段故事,而不只是编码。
他们通常使用所选编程语言的功能来构建更加丰富、更具表现力和更加简洁的代码块。这使他们成为更好的“故事讲述者”。
Venus Williams为我们敲响警钟:
每个人都有自己的注释,这是谣言的开始。
Everyone makes their own comments. That’s how rumors get started.
注释是一把双刃剑,在正确的位置添加注释可以为他人提供最有用的帮助。另一方面,浪费空间来添加无用的注释会使代码更加的混乱。如果注释提供了错误的信息,那对代码来说可以说是一种灾难了。
总之,注释是一种不可缺少的恶魔。为什么呢?通常,代码的注释越旧,维护起来就越困难。很多程序员因为修改代码时不维护注释而臭名昭著。
随着代码的发展,代码做出了许多改动,但注释并没有随之修改,这是一个很大的问题。
请铭记,带有少量注释的简洁代码远胜于带有大量注释的混乱代码。不要浪费时间来解释你制造的混乱,而是要花些时间来清理这些混乱。
Robert C. Martin说过
代码格式与沟通有关,而沟通是专业开发人员的首要任务。
Code formatting is about communication, and communication is the professional developer’s first order of business.
上面的说法可能不被大家认可,但这是一个优秀的开发人员的最重要的品质。格式化的代码是你心灵的窗户,我们希望人们对我们的秩序、对细节的关注和思想的清晰印象深刻。当他人看代码时,如果看到的是混乱的、开头结尾不清晰的代码块,这会直接损害我们的声誉,这一点毋庸置疑!
如果你认为代码“可以使用”是专业程序员的第一要务,那么你不会有很好的发展的。你今天的功能很有可能在下个版本进行更改,但代码的可读性是不会改变的。
当原始代码已经改的面目全非时,代码的风格和可读性将影响代码的可维护性。
以后,你会因为自己的代码风格和纪律被人们记住,而不会因为某段代码。因此,你需要注意你的代码格式,使它受到简单的规则约束,这样的规则必须是所有团队成员都能理解的。
Georges Canguilhem明确提到:
人类都会犯错误,但是坚持错误的却是恶魔。
To err is human, to persist in error is diabolical.
错误处理是每个程序员都必须要做的事情,输入可能异常,设备也可能故障。作为开发人员,我们希望程序按照我们的预期来执行。然而,问题不是处理错误,而是清晰易读的错误处理方式。
很多代码以处理错误为主,导致主代码逻辑被淹没在其中。这种做法是完全错误的。代码应该整洁、健壮,并且以一种优雅的方式处理错误,这也是优秀工程师的一种标志。
其中一个错误处理方法是通过适当的try-catch代码块来捕获所有错误。在执行try-catch-finally中try部分的代码时,任何时间发生异常,都会进入catch部分执行。
因此,在代码中使用try-catch-finally可能是一种比较好的选择。它能帮助你在try部分定义你希望执行的代码,而不用去担心代码出错时怎么办。
你抛出的每一个异常都应该具有完整的上下文以确定错误的来源和位置。具有创造性的错误信息会在代码写出来后很久,甚至是作者已经离开很长时间后仍然被人们记住。
那么如何综合一下上面提到的技巧呢?
答案是代码意识,是软件工程中的一种常识。
The answer is code-sense; the software equivalent of common sense.
据Robert Martin所说,”编写整洁的代码需要通过一段痛苦的过程来获得一些小技巧,这些小技巧被称为代码意识“。有些人天生就有这种感觉,而有些人则需要通过实践、坚持不懈和毅力来获取它。这种意识不仅仅是帮助我们区分好代码和坏代码,更能够给我们代码将坏代码转换成好代码的能力。
代码意识可以帮助开发者们选择最好的工具来指导他们创造出更有价值的整洁又漂亮的代码。
简而言之,具有代码意识到程序员就像是画家,他可以将一块空白的屏幕变成精美的艺术品,并被人们记住很长时间。
就像Harold Abelson所说的一样:
代码写出来首先是给人读的,然后才是指导机器要怎么做。
“A handbook of Agile Software Craftsmanship” — Robert Martin.
“A handbook of Agile estimation” — Mike Cohn
https://medium.com/swlh/excellent-code-clean-and-beautiful-code-b541ca4b5a39
这位作者以一种比较激进的语言告诉大家要注意代码的可读性,不过大家的观点都很类似,无非就是命名、代码格式、注释和错误处理这些点。希望这篇有些激进的文章可以帮助到一些同学,减少别人在review你的代码时,使用WTF的次数。