编写可读代码的艺术

Time: 二月 24, 2015
Category: Programming practices

可读性的基本定理:代码的写法应当使别人理解它所需的时间最小化

1. 简单

1.1 合理的命名规范

把信息塞入名字中,读者通过名字就可以获得足够的信息量

  1. 使用专业的单词
  2. 避免空泛的名字
  3. 使用具体的名字来更细致地描述事务
  4. 给变量名带上重要的细节
  5. 为作用域更大的名字采用更长的名字
  6. 有目的地使用大小写、下划线等

1.2 审美

审美的三条原则:

  1. 使用一致的布局,让读者很快地习惯这种风格
  2. 让相似的代码看上去相似
  3. 把相关的代码进行分组,形成代码块(其实这个更应该是 正确的抽象 里的内容)

1.3 注释

注释的目的是尽量帮助读者了解的和作者一样多

  1. 了解什么不需要注释
    • 不要为那些从代码本身就能快速推断的事实写注释
    • 与其用注释来解析烂代码,还不如老老实实把代码写好
  2. 用代码记录你的思想
    • 指导性批注:为什么写成这样?(而不是那样?)
    • 代码中的缺陷(TODO|FIXME|BUG)
    • 常量背后的故事,例如为何取这个值
  3. 站在读者的角度,去想象他们需要知道什么
    • 对读者可能有疑问的地方注释
    • 对读者可能会意料之外的行为加上注释
    • 可以从全局的角度简单的阐述代码的行为

另外,注释应该尽可能简明扼要

  1. 保持紧凑
  2. 避免使用不明确的代词
  3. 精确描述函数行为
  4. 声明代码的高层次意图,而非明显细节
  5. 用嵌入的注释来解释难以理解的函数参数
  6. 多使用专业术语

1.4 简化控制流

把条件、循环以及其他对控制流的改变做得越自然越好,让读者对你的代码一目了然

  1. 条件语句中的参数顺序
    • 比较的左侧:被问询的表达式,它的值倾向于不断变化
    • 比较的右侧:用来被参考的表达式,通常是个常量,或者比较稳定的值
    • 通常这样做能避免把 == 写成 = 这样的BUG
  2. 重新排列 if/else 区块,先处理正确的、简单的、有趣的情况
  3. 尽量少用三目运算符
    • 默认情况下使用 if/else 替代,只有才很简单的情况下才使用三目运算符
    • 相对于追求最小化代码行数,一个更好的度量方法是最小化人们理解它所需的时间
  4. 避免使用 do/while 循环(这个我倒觉得关系不大,不太认同)
  5. 避免使用goto(应该是学会正确使用,goto还是很常用的)
  6. 减少嵌套

2. 正确的抽象

我将书中谈到的几个点归为这一类,其实更好的推荐应该是设计模式相关的内容。这里仅仅做个笔记吧。

2.1 拆分表达式

  1. 引入解释变量,好处是:
    • 把巨大的表达式拆分成小段
    • 可以通过简单的名字来将子表达式文档化
    • 帮助读者识别代码中的主要概念
  2. 摩根定理

2.2 变量与可读性

  1. 减少无用的中间变量
  2. 减少每个变量的作用域,作用域很小的变量就在作用域内声明一下
  3. 只写一次的变量好,那些只设置一次的变量(constfinal等)使得代码更容易理解

2.3 重构代码

  1. 模块化,单一职责
  2. 不要过度设计
  3. 避免dead code,少写代码
  4. 重新考虑需求,解决版本最简单的问题,只要能完成工作就行
  5. 经常通读标准库的整个API,保证对它们的熟悉程度

Leave a Comment