Jason McCreary 原做,受权 New Frontend 翻译。程序员
我已经写了二十年代码了,这期间我在十七个团队用不一样语言写了几百个项目,其中不只有简单的博客站点,还有支撑每秒 3000 次请求的 API 服务,以及不少热门应用。编程
经过这些经历,加上一些我读过的书,我总结出了写代码时最须要关注的东西:可读性。数组
表面上来看,可读性是个很主观的东西,它跟语言、代码库、团队都有关系。可是若是你深刻研究的话,就会发现其实有不少不管什么代码都能用到的提高可读性的方法。app
不少程序员写代码时只会在乎「机器」的那一面:只要代码能运行,其余的就无论了。这最终形成了「人」的那一面被忽视掉了。ide
在过去几个月里,我把有关「人」的那一面总结成了下面十个能让你专一于编写简单、可读代码的好习惯。我在 BaseCode 里面对每一条都进行了详细解释,并把它们应用到了真实世界的代码片断上。函数式编程
然而不少人仍是会对它们嗤之以鼻,以为这些都太基本了,不值得关注。可是我能够保证,每个我接触到的低质量的代码都没能达到这些要求,而每个你能读到的高质量的代码,即使作不到大部分,也都至少能作到其中一点。函数
咱们平时花了太多精力来格式化代码:用 tab 仍是用空格、换行大括号仍是大括号换行等等。有一天你会忽然发现,写代码的时候其实不该关注如何去格式化。最好的作法仍是为整个代码库选择一个标准,而后让一切自动化,这样你就能把精力从新放回写代码自己了。ui
全部被注释掉的代码、没有用到的变量、程序不会通过的代码都是废物。它们时时刻刻在向读代码的人传递着「个人主人不在意我」这样的信息。代码库里一旦有了这样的代码,恶性循环就开始了。渐渐地,这些无用代码会让你的代码库变成一个烂摊子,这跟破窗效应差很少。因此你必须时常检查并清理无用代码。即便不把它看成主要任务,至少你也应该作一名童子军。.net
几乎全部的代码都是基于逻辑产生的。咱们经过代码来产生决策、构造重复、执行计算,这每每会致使代码中存在不少层级。尽管计算机能够很轻易地理清这一切,然而对于人类来讲就困难多了。过多的嵌套会让代码看起来更复杂且难以阅读。要解决这个问题,能够经过使用卫语句、提早返回、函数式编程的方法把代码铺平开来。翻译
尽管如今是一个面向对象编程的时代,但咱们仍是会沉迷于原始的方法。咱们会写很长的参数列表,把全部数据堆在一块儿,或是本身定义数组和字典的结构。其实这些东西均可以被重构成多个对象。这么作不只让数据更加结构化,还能够整理出会反复用到的操纵原始数据的逻辑。
尽管并无一个明确的数字,但代码块仍是应该小于某个长度的。若是你知道你的代码里有较大的代码块,你能够把它找出来,而后从新组织它或者是重构它。这个简单的过程能让你认识到代码块的上下文以及抽象等级,这样你就能够正确地认清代码块的做用并将其重构为多个更简单、更可读的代码块。
命名确实很难,不过这仅仅是由于咱们把它弄复杂了。其实有一个小技巧能够运用在包括命名在内的不少编程难题上:推迟。遇到命名难题时,不要卡在上面,而是要继续前进。若是有须要的话,能够先用一句话来命名一个变量。我能够保证在你完成一个功能或是整个项目的时候,你天然会想到一个合适的名字。
这个小小的习惯彻底改变了个人编程生涯,让我真正开始关注代码的可读性。尽管我解释了一遍又一遍,仍是会有人由于这个而讨厌我。他们总能拿出一个例子来证实注释是绝对有用的。确实,假如哈勃望远镜的遥测系统就是须要经过返回 687
这个值来跟一个古老的适配器进行交流,那么代码旁边的注释仍是有用的。可是对于大多数其余状况来讲,你应该试着重写代码,争取让读代码的人不靠注释就能理解它。
咱们老是爱返回各类奇奇怪怪的值(像 -1
、687
、null
),尤为是遇到边界状况的时候。反过来,又写了不少代码去处理这些值。实际上,发明 null
的人把它形容为十亿美圆的损失。你应该尽量返回有意义的值,最好是在即便方法内部出错的状况下还能让剩余的代码继续正常执行。若是确实有例外状况,必定有比直接返回 null
更好的交流方式。
假设存在一串数字,我告诉你第一个是 2
,而后问你后面是几,你可能会说 3
跟 4
,但也有多是 1
或 2.1
(其实真要问你的话,你可能毫无头绪)。这时我额外给你一个数字,问你 2, 4
后面是几,你可能会说 6
或 8
或 16
(尽管答案更加肯定,不过仍是有点茫然)。这时我再给你一个数字,问你 2, 4, 16
后面是几,这时做为程序员的你确定能看出数字间平方的关系,而后肯定出下一个数字是 256
。这就是「三的法则」。
上面这个不包含代码的例子其实告诉咱们不要过早地决定一种抽象或设计方式。三的法则就是要咱们克服想去减小重复的需求,把它推迟到有足够数据去支撑决策的时候。用 Sandi Metz 的话来讲,就是「错误的抽象付出的代价要比重复更多」。
用好了这一条,你的代码就能增添几分诗同样的可读性。Kent Beck 的《Implementation Patterns》中这样写道:
代码里面的对称性就是指同一个主意在不一样地方都以同一种方式表达。 不过提及来容易作起来难,对称性其实蕴含了创造性写做的色彩。它构成了命名、结构、对象、模式等方面的基础,并且在不一样语言、代码库、团队之间也会有所不一样。照这么说,你大概须要用一生的生命去追求它。因此,当你开始在代码里运用对称性以后,一个更干净的形态就会产生,而且你的代码会更快成型。
以上是对 BaseCode 里面提到的习惯的概述。我建议你去浏览这篇文章里连接到的资源,观看实践这些习惯的录像,或者去 BaseCode 里面详细阅读如何在真实世界的代码片断中运用这些习惯。
Photo by Edu Lauton on Unsplash