读书笔记《编写可读代码的艺术》

272 阅读6分钟

笔记说明

这篇记录基本都是对原文的摘抄。原书写的非常通俗易懂,例子也比较贴切,读起来毫不费力。原书的目录即大纲,事实上把目录扫一遍或把每章之后的总结翻一遍,也就知道讲了哪些思想了。

因为在读的过程中感受到很多有益的思想,比如可读性定理、自然语言描述等等,我觉得应当把它们都总结起来,这样在开始coding以及review的时候可以很快地过一遍以查漏补缺。

其实最好是抽时间把原书通读一遍,很快的~ 如果没有时间,也可以把下面的总结过一下,几分钟的时间,也许会有所启发。如果有哪里有疑问,再去书中翻一下对应的章节看一下例子。

如果对这些思想有印象的话,在coding时应当可以找到正确的方法,避免一些想当然的错误写法。或者在两种写法里抉择时会有新的启发。

书籍:book.douban.com/subject/107…

译者序

代码最重要的读者是人。写出的代码能让人快速理解、轻松维护、容易扩展的程序员才是专业的程序员。

第一部分 表面层次的改进

第1章 代码应当易于理解

可读性基本定理

有一种对可读性的度量比其他任何的度量都要重要。

代码的写法应当使别人理解它所需的时间最小化。

可读性基本定理总是先于本书中任何其它条例或原则。

第2章 把信息装到名字里

  • 使用专业的单词(比如用 Fetch 或 Download 代替 Get)
  • 避免空泛的名字(比如 tmp)
  • 使用具体的名字来更细致地描述事物
  • 给变量名带上重要的细节(如单位、raw_)
    • 如果你的变量是一个度量的话(如时间长度或者字节数),那么最好把名字带上它的单位。
  • 为作用域大的名字采用更长的名字
  • 有目的地使用大小写、下划线等

第3章 不会误解的名字

不会误解的名字是最好的名字

一些tips:

  • 当要定义一个值的上限或下限时,max_和min_是很好的前缀。
  • 对于包含的范围,first和last是好的选择。
  • 对于包含/排除范围,begin和end是最好的选择,因为它们最常用。
  • 当为布尔值命名时,使用is和has这样的词来明确表示它是个布尔值,避免使用反义的词(例如disable_ssl)
  • 要小心用户对特定词的期望。例如,用户会期望get()或者size()是轻量的方法。

第4章 审美

审美与好的设计是两种独立的思想

使代码“看上去漂亮”通常会带来不限于表面层次的改进,它可能会帮你把代码的结构做得更好。

一致的风格比“正确”的风格更重要。

不要给不好的名字加注释——应该把名字改好

好代码>坏代码+好注释。

把大块代码分成逻辑上的“段落”。

第5章 该写什么样地注释

什么地方不需要注释

  • 能从代码本身中迅速地推断的事实。
  • 用来粉饰烂代码(例如蹩脚的函数名)的“拐杖式注释”——应该把代码改好。

读者立场思考:

  • 预料到代码中哪些部分会让读者说:“啊?”并且给它们加上注释。
  • 为普通读者意料之外的行为加上注释。
  • 件/类的级别上使用“全局观”注释来解释所有的部分是如何一起工作的。
  • 注释来总结代码块,使读者不致迷失在细节中。

第6章 写出言简意赅地注释

  • 声明代码的高层次意图,而非明显的细节。

第二部分 简化逻辑和循环

第7章 把控制流变得易读

  • 在写一个比较时(while(bytes_expected > bytes_received)),把改变的值写在左边并且把更稳定的值写在右边更好一些
  • if/else:先处理正确的、简单的、有趣的情况
  • 用线性的代码,避免深嵌套
  • 提早返回可以减少嵌套并让代码整洁

第8章 拆分超长的表达式

  • 引入“解释变量/总结变量”来代替较长的子表达式
  • 用德摩根定理来操作逻辑表达式

第9章 变量与可读性

  • 减少不能改进可读性的变量
    • 比如没有价值的临时变量
    • 中间结果
    • 控制流变量
  • 缩小变量的作用域

让你的变量对尽量少的代码行可见

- JS 可以用闭包实现这一目的
  • 常量(const、final、常量) is better

第三部分 重新组织代码

三种组织代码的方法:

  • 抽取出那些与程序主要目的“不相关的子问题”。
  • 重新组织代码使它一次只做一件事情
  • 先用自然语言描述代码,然后用这个描述来帮助你找到更整洁的解决方案。
  • 可以把代码完全移除或者一开始就避免写它的那些情况——唯一可称为改进代码可读性的最佳方法。

第10章 抽取不相关的子问题

把一般代码和项目专有的代码分开

第11章 一次只做一件事

应该把代码组织得一次只做一件事情。

流程:

  1. 列出代码所做的所有“任务”。这里的“任务”没有很严格的定义——它可以小得如“确保这个对象有效”,或者含糊得如“遍历树中所有结点”。
  2. 尽量把这件任务拆分到不同的函数中,或者至少是代码中不同的段落中。

第12章 把想法变成代码

橡皮鸭技术

  1. 像对着一个同事一样用自然语言描述代码要做什么。
  2. 注意描述中所用的关键词和短语。
  3. 写出与描述所匹配的代码。

第13章 少写代码

  • 从项目中消除不必要的功能,不要过度设计。
  • 重新考虑需求,解决版本最简单的问题,只要能完成工作就行。
  • 经常性地通读标准库的整个API,保持对它们的熟悉程度。

第四部分 精选话题

第14章 测试与可读性

  • 每个测试的最高一层应该越简明越好。最好每个测试的输入/输出可以用一行代码来描述。
  • 如果测试失败了,它所发出的错误消息应该能让你容易跟踪并修正这个bug。
  • 使用最简单的并且能够完整运用代码的测试输入。
  • 给测试函数取一个有完整描述性的名字,以使每个测试所测到的东西很明确。不要用Test1(),而用像Test_FunctionName_Situation 这样的名字。
  • 要使它易于改动和增加新的测试。