编写可读代码的艺术 | 读后感

还记得当时在特训营听到的第一句话吗?

代码是给人看的,偶尔在机器上运行一下。

既然代码是给人看的,那么怎样才能让人看懂呢?于是便有了《编写可读代码的艺术》这本书。

全书共分为四个部分:表面层次的改进、简化循环和逻辑、重新组织代码,以及精选话题。

表面层次的改进

这部分主要关注于命名、审美、注释。

命名
  1. 把信息装到名字里 —— 读者通过名字就可以获得大量信息,即见明知意
    • 选择专业的词 —— eg:不用 get,使用 fetch 或 download
    • 避免空泛到底名字 —— eg:避免使用 tmp 等,除非有必须使用的理由。
    • 用具体的名字代替抽象的名字
    • 给变量名加上重要的细节
    • 为作用域大的名字采用更长的名字
    • 有目的的使用大小写
  2. 不会误解的名字 —— 读者根据名字可以体会到你的本意,而不会有其他的理解。
审美
  1. 存在多个代码块做相似的事情,让它们有同样的剪影。
  2. 把代码块按 “列” 对齐,让代码更容易浏览。
  3. 使用空行把代码分成逻辑上的 “段落”
注释

严格说来,当你的代码在命名方面符合见明知意,并且代码的审美也是比较好的,那么代码是不需要注释的,所以我跳过了该部分。

简化循环和逻辑

该部分本质和第一部分的目标是一样的,让循环和逻辑中的代码容易理解。

把控制流变得易读
  1. 使用 while 循环时,把改变的值写在左边,稳定的值写在右边。例如:
while(max < 30)
  1. 使用 if / else 时,先处理简单的情况。例如:
if (max < 30) {
  return max;
}
return max + 30;
  1. 三目运算符、do/while 循环会导致代码的可读性变差,尽量减少使用。
拆分超长的表达式

当某个表达式中含有较长的字表达式时,建议将该超长子表达式赋值给一个变量,然后将改变量作为表达式的变量。eg:

if line.split(':')[0].strip() == "root":
  ···

改为:

username = line.split(':')[0].strip();
if username == "root":
  ···

其好处:

  • 将巨大的表达式拆成小段
  • 通过简单的名字描述子表达式,让代码更具可读性
  • 帮助读者识别代码中的主要概念
变量与可读性
  1. 减少变量,即减少那些妨碍的变量
  2. 减少每个变量的作用于,越小越好。把变量移到一个有最少代码可以看到它的地方。
  3. 只写一次的变量更好。那些只设置一次值的变量,使得代码更容易理解。

重新组织代码

前面都在对代码做出微小的改动,该部分会讨论函数级别将对代码做出更大的改动。

抽取不相关的子问题

把一般代码和项目专有的代码分开。使得最后大部分都是一般代码,通过建立一大组库和辅助函数来解决一般问题,剩下的只是让程序与众不同的核心部分。

Eg:项目中常常会有个专门的目录( util )来存放项目中用到的工具类,目录(exception)来存放项目中使用异常类,etc。

一次只做一件事

在你的代码中存在某个超长的函数,此时,你可以拆分该函数,从中抽取子函数,使得每个子函数只做一件事。以此来简化函数中的逻辑。

把想法变成代码

用自然语言描述程序,然后用这个描述来帮助你写出更自然的代码。需做到一下几点:

  1. 能够清楚的描述逻辑
  2. 了解库函数
  3. 把这个方法应用于更大的问题
少写代码

代码库的代码越多,则越重,在其上开发也就越难,同时每行新代码都要测试赛、写文档和维护。因此我们需要做到以下几点,来实现少写代码:

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

精选话题

前面我们讨论了很多增强代码可读性的要点,在这部分我将其应用于实践中。

测试与可读性

代码的可读性很重要,测试代码的可读性同样主要重要。因此为了改进测试,我们需要做到以下几点:

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

你可能感兴趣的:(编写可读代码的艺术 | 读后感)