【译】什么才是优秀的代码

究竟什么是优秀的代码?Robert Martin的一句话可以完美诠释。

代码质量的唯一衡量标准是每分钟说多少次WTF

我来解释一下这句话。当我在做code review时,通常会有三种不同的感受:

  • What-the-F**k (厌恶脸) — 这段代码并不是必要的
  • What-the-F**k (一脸钦佩) — 这家伙真聪明啊
  • What-the-F**k (愤怒值爆表) — 这什么垃圾玩意

所以当我们看代码时影响我们的第一印象的因素是什么呢?

这是一段整洁又漂亮的代码。

能够写出整洁又漂亮的代码是一个优秀工程师的标志。

It is Clean and Beautifully written code.

And writing clean and beautiful code is the mark of a GREAT softwarecraftsman.

要学会这项伟大的事业有两个关键点:知识和工作

知识会教给你如何在变得更加专业的模式、原则、实践和启发式的方法。但这些知识需要你通过大量的读写、不断的实践和努力才能获得。

简而言之,学会如何写整洁的代码并非一件简单的事。你必须要为之付出努力,必须一次又一次的练习、发现问题、经历失败,直到正确处理为止。这一过程没有任何捷径。

下面我将向你介绍一些如何写出整洁且漂亮的代码的技巧。

“What is in a NAME”

Kendrick Lamar说过:

如果我要讲一个真实的故事,那么一定是从故事的命名开始。

If I’m gonna tell a real story, I’m gonna start with my name

命名会遍布代码的每一个角落,我们会为函数、类、参数、包等命名,还会为源文件、目录命名。总之,在写代码的过程中,好的命名可能是使代码变整洁的最重要的因素。

你的命名应该显示出你的意图。选择一个好的名称会耗费你的一些时间,但是如果随意命名,以后你会浪费更多的时间来理解它。所以请尽可能使你的命名更加合理,读你的代码的人也会因此感谢你。

你要谨记的是,变量、函数和类的命名应该能回答三个问题:它为什么存在、它是做什么的、它用在哪里。

这不仅需要良好的描述能力,还需要了解跨国界的文化背景。要教会你这些,没有人能比你自己更合适了。

“Functions should DO ONLY ONE THING.”

我们所说的「单一责任」原则。

Louis Sullivan对此有过完美的描述

形式跟随函数

Form follows function.

每个系统都是由特定的编程语言构建而成。函数通常是动词,而类通常是名词。函数任何编程语言中通常都是出现在第一行,写出整洁代码的本质其实就是写出整洁的函数。

要想写出整洁的函数,首先应该遵循两条黄金法则:

  • 函数应该尽可能短小
  • 函数应该只做一件事

这意味着你的函数不应该出现嵌套的结构。所以函数的缩进级别不应该大于一个或两个,这会让你的代码更容易阅读、理解和消化。除此之外,我们还需要确保函数中的语句都处于同一抽象级别。

在一个函数中如果混有不同的抽象级别通常会使代码变得十分混乱,并且难以管理。优秀的工程师会把函数当作给别人讲的一段故事,而不只是编码。

他们通常使用所选编程语言的功能来构建更加丰富、更具表现力和更加简洁的代码块。这使他们成为更好的“故事讲述者”。

“Comments do not make up for bad code”

Venus Williams为我们敲响警钟:

每个人都有自己的注释,这是谣言的开始。

Everyone makes their own comments. That’s how rumors get started.

注释是一把双刃剑,在正确的位置添加注释可以为他人提供最有用的帮助。另一方面,浪费空间来添加无用的注释会使代码更加的混乱。如果注释提供了错误的信息,那对代码来说可以说是一种灾难了。

总之,注释是一种不可缺少的恶魔。为什么呢?通常,代码的注释越旧,维护起来就越困难。很多程序员因为修改代码时不维护注释而臭名昭著。

随着代码的发展,代码做出了许多改动,但注释并没有随之修改,这是一个很大的问题。

请铭记,带有少量注释的简洁代码远胜于带有大量注释的混乱代码。不要浪费时间来解释你制造的混乱,而是要花些时间来清理这些混乱。

“Formatting Code is always a priority”

Robert C. Martin说过

代码格式与沟通有关,而沟通是专业开发人员的首要任务。

Code formatting is about communication, and communication is the professional developer’s first order of business.

上面的说法可能不被大家认可,但这是一个优秀的开发人员的最重要的品质。格式化的代码是你心灵的窗户,我们希望人们对我们的秩序、对细节的关注和思想的清晰印象深刻。当他人看代码时,如果看到的是混乱的、开头结尾不清晰的代码块,这会直接损害我们的声誉,这一点毋庸置疑!

如果你认为代码“可以使用”是专业程序员的第一要务,那么你不会有很好的发展的。你今天的功能很有可能在下个版本进行更改,但代码的可读性是不会改变的。

当原始代码已经改的面目全非时,代码的风格和可读性将影响代码的可维护性。

以后,你会因为自己的代码风格和纪律被人们记住,而不会因为某段代码。因此,你需要注意你的代码格式,使它受到简单的规则约束,这样的规则必须是所有团队成员都能理解的。

Write your “try-catch-finally” statement first

Georges Canguilhem明确提到:

人类都会犯错误,但是坚持错误的却是恶魔。

To err is human, to persist in error is diabolical.

错误处理是每个程序员都必须要做的事情,输入可能异常,设备也可能故障。作为开发人员,我们希望程序按照我们的预期来执行。然而,问题不是处理错误,而是清晰易读的错误处理方式。

很多代码以处理错误为主,导致主代码逻辑被淹没在其中。这种做法是完全错误的。代码应该整洁、健壮,并且以一种优雅的方式处理错误,这也是优秀工程师的一种标志。

其中一个错误处理方法是通过适当的try-catch代码块来捕获所有错误。在执行try-catch-finally中try部分的代码时,任何时间发生异常,都会进入catch部分执行。

因此,在代码中使用try-catch-finally可能是一种比较好的选择。它能帮助你在try部分定义你希望执行的代码,而不用去担心代码出错时怎么办。

你抛出的每一个异常都应该具有完整的上下文以确定错误的来源和位置。具有创造性的错误信息会在代码写出来后很久,甚至是作者已经离开很长时间后仍然被人们记住。

Bringing it all together

那么如何综合一下上面提到的技巧呢?

答案是代码意识,是软件工程中的一种常识。

The answer is code-sense; the software equivalent of common sense.

据Robert Martin所说,”编写整洁的代码需要通过一段痛苦的过程来获得一些小技巧,这些小技巧被称为代码意识“。有些人天生就有这种感觉,而有些人则需要通过实践、坚持不懈和毅力来获取它。这种意识不仅仅是帮助我们区分好代码和坏代码,更能够给我们代码将坏代码转换成好代码的能力。

代码意识可以帮助开发者们选择最好的工具来指导他们创造出更有价值的整洁又漂亮的代码。

简而言之,具有代码意识到程序员就像是画家,他可以将一块空白的屏幕变成精美的艺术品,并被人们记住很长时间。

就像Harold Abelson所说的一样:

代码写出来首先是给人读的,然后才是指导机器要怎么做。

References

“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的次数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容