谈谈编写可读性代码

1,066 阅读5分钟

刚毕业的时候读过 Bob 大叔的《Clean Code》, 那时候只是被动接受,没有进行更有效的思考,现在也忘记的差不多了。记得在进行公司培训时一部分内容就是代码规范和公司常用的推荐写法,当时也不知道为什么这样子做, 老大告诉我们,这就是团队做出的决定,喜欢不喜欢照做就是。

开发中我们不可避免的要阅读别人代码,一般会出现两种场景:

  • 哇,这块代码写的太棒了, 结构简单、逻辑清晰。

  • 艹,这代码写的一坨坨的,也不知道他在表达什么,写的人是不是当时脑袋被门挤压后写下的代码。

我们当然不想成为第二种,那什么样的代码符合可读性的特质?

*可读性 == 可测试 == 代码质量 == 代码优雅 *是的, 它们自己是等价的

这本书译版不过170多页很薄,通过漫画的形式展示每个主题,幽默合理,直指问题要害,阅读起来很有趣,有图有真相。主要分四大部分:

  • 表面层次的改进

  • 简化循环和逻辑

  • 重新组织代码

  • 测试与可维护

表面层次的改进

谈到如何命名?

  • 避免使用专业词汇。

  • 避免空泛的名字。

  • 为作用域大的名字采用更长的名字

如何添加注释?

  • 不要为了写注释而写注释

  • 不要给不好的名字加注释—应该改进命名和重构

  • 为代码中的瑕疵写注释:这里单独提一下 HACK(以前没有注意过)—-对一个问题不得采取的粗糙解决方案

简化循环和逻辑

文中提到条件语句中参数的顺序、告诉我们可以通过重新排列 if/else 语句中的语句块。通常来讲,先处理正确的/简单的/有趣的情况。有时候这些准则会冲突,但是当不冲突时, 这是要遵循的经验法则。

通常来讲提早返回可以减少嵌套并让代码整洁。

一个简单的技术是引入「解释变量」来代表较长的子表达。这种方式有三个好处:

  • 它把巨大的表达拆成小段

  • 它通过用简单的名字描述子表达式来让代码文档化

  • 它帮助读者识别代码中的主要概率

重新组织代码

文中提到「抽取不相关的子问题」和 Martin Fowler 在中《重构》描述的重构的「抽取方法」相似,而他写的更为详细, 感兴趣的可以去读读。

如何可以少写代码

  • 从项目中消除不必要的功能,不要过度设计。

  • 重新考虑需求,解决版本最简单的问题,只有能完成工作就行。

  • 经常性的通读标准库的整个 API,保持对它们的熟悉程度。

测试与可维护

文中提到,在测试代码中,可读性也很重要。如果测试的代码可读性好,其结果是它们会变得很容易些, 因此大家会更多的测试。并且,如果你把真实代码设计的容易测试,代码整个设计会变得更好。

以下是如果改进测试的几个具体要点:

  • 每个测试的最高一层应该越简洁越好。最好每个测试的输入/输出可以用一行代码来描述。

  • 如果测试失败了, 它所发出来的错误消息应该能让你容易跟踪并修正这个 bug。

  • 使用最简单的并且能够完整的运用代码的测试输入。

  • 给测试函数取一个完整的描述性的名字,以使每个测试所测到的东西很明确。

作者也提到测试走的太远的情况:

  • 牺牲真实代码的可读性,只是为了使用测试

  • 着迷于100%的 测试覆盖率

  • 让测试成为产品开发的阻碍

思维导图

就想本书的名字一样,艺术这个东西本来就是每个人鉴别的方式不一样,但是称得上艺术的东西, 一定符合艺术评断标准的。

编码规范这种事情,本来都是有主观有客观的。

像字节编码、换行、命名之类的事情就是主观的,在公司团队开发中就应该硬性统一,以便协作流畅。

最近阿里巴巴发布一个Java 编码规范---《阿里巴巴Java开发手册(正式版)》,设计编码的方方面面,有兴趣的同学可以看一下。

我也大致撸了一遍, 文档本身没有太大问题,不过,在网页、Github 高度发达的今天,为什么阿里没有选择将它放在网页上,而是用 PDF 的形式发布?为什么不做成类似:

Google Java Style Guide https://google.github.io/styleguide/javaguide.html

有人说,编码规范这种东西就是体现「码农」和「工程师」本质区别的地方。

知乎上有个相关的问题「如何写出优雅的代码?」,我很赞同下面的回答:

多写,写的少的说啥都是空话。 讲语法和应用的书一般培养不出所谓的「优雅」,不是作者水平不高的问题,是这样的书就应该务实,不扯淡。 将编程美感的书,一般来说,如果写代码不够多,只是读书,毫无收益,只会害自己。所以还是要写。

其实什么样的代码是优雅的, 可读性好,可能也不过是自以为罢了。掌握一些基本的技巧就好了, 如果大家都严格遵循那些条条框框, 也不会有那么多不同语言和框架了。

最后所谓的代码优雅不过是程序员们用来自慰的工具罢了。爽于不爽只有自己知道。

更多精彩内容请关注: