编写可读代码的艺术
书名:编写可读代码的艺术
作者:Dustin Boswell & Trevor Foucher
译者:尹哲,郑秀雯
主要内容:
- 简化命名、注释和格式的方法,使每行代码都言简意赅。
- 梳理程序中的循环、逻辑和变量来减少复杂度并理清思路。
- 在函数级别解决问题,例如重新组织代码块,使其一次只做一件事。
- 编写有效的测试代码,使其全面而简洁,同时可读性更高。
前言
可读性基本定理:代码的写法应当使别人理解它所需的时间最小化。
第一部分 表面层级的改进
把信息装在名字里
关键思想
无论命名变量、函数还是类,把信息装在名字里。
- 选择专业的词
- 避免空泛的名字
- 用具体的名字代替抽象的名字
- 使用前缀或后缀来给名字附带更多信息
- 后缀如计量单位
- 决定名字的长度
- 不要为了短而使用一些对新同事不友善的缩写
- 利用名字的格式来表达含义
- 有目的的使用大小写、下划线等
不会误解的名字
关键思想
要多问自己几遍:“这个名字会被解读成其他的含义吗?”要仔细审视这个名字。
- 不要使用二义性单词作为名字
- 推荐用min和max来表示极限
- 推荐用first和last来表示包含的范围
- 推荐用begin和end来表示包含/排除范围
- 使用is和has这样的词来明确表示它是布尔值,避免使用反义的词
- 遵从行业习惯
审美
使用一致的布局,让读者快速习惯代码风格。
让相似的代码看上去相似。
把相关的代码行分组,形成代码行。
- 重新安排换行来保持一致和紧凑
- 用方法来整理不规则的东西
- 在需要时使用列对齐
- 选一个有意义的顺序,始终一致的使用它
- 让变量的顺序与对应的HTML表单中字段的顺序相匹配
- 从“最重要”到“最不重要”排序
- 按字母顺序排序
- 把声明按块组织起来
- 把代码分成“段落”
- 一致的风格比“正确”的风格更重要
该写什么样的注释
关键思想
注释的目的是尽快帮助读者了解得和作者以一多。
- 不要为了注释而注释
- 代码之美而不是注释之美
- 不要为能快速推断出的事实写注释
- 给常量加注释
- 为代码中的瑕疵加注释
- 记录自己有价值的简介
- 公布可能的陷阱
- “全局观注释” 解释类之间的协作,数据流流程,项目入口等
- “总结性注释”
写出言简意赅的注释
关键思想
注释应当有很高的“信息/空间率”
- 让注释保持紧凑
- 避免使用不明确的代词
- 润色粗糙的句子
- 精确的描述函数的行为
- 用输入/输出例子来说明特别的情况
- 声明代码的意图
- “具名函数参数”的注释
- 采用信息含量高的词-
第二部分 简化循环和逻辑
把控制流变得易读
关键思想
把条件、循环以及其他对控制流程的改变做得越“自然”越好,运用一种方式使读者不用停下来重读的代码。
相对于追求最小化代码行数,一个更好的度量方法是最小化人们理解它所需的时间。
- 条件语句中的参数的顺序
- 比较的左侧 “被问询的”表达式,它的值更倾向于不断变化
- 比较的右侧 用来做比较的表达式,它的值更倾向于常量
- if/else语句块的顺序
- 首先处理正逻辑而不是负逻辑的情况
- 先处理掉简单的情况
- 先处理有趣的或者是可疑的情况
- ?:条件表达式(三目运算符)
- 默认情况下都用if/else,三目运算符?:只有在最简单的情况下使用。
- 避免do/while循环
- 从函数中提前返回
- 有些程序员认为函数中永远不应该出现多条return语句,这是胡说八道。从函数中提前返回没有问题,而且常常很受欢迎。
- 最小化嵌套
- 当你对代码做改动时,从全新的角度审视它,把它作为一个整体来看待
- 通过提早返回来减少嵌套(if:return; for:continue)
拆分超长的表达式
关键思想
把你的超长表达式拆分成更容易理解的小块。
- 用作解释的中间变量
- 总结变量 只是用一个短很多的名字来代替一大块代码
- 使用德摩根定理
- 不要滥用短路逻辑
- 要小心“智能”的小代码块——它们往往在以后会让别人读起来感到困惑。
变量和可读性
- 减少变量
- 缩小变量作用域
- 常量使得代码更容易阅读
第三部分 重新组织代码
抽取不相关的子问题
关键思想
把通用代码和项目专有代码分开。
积极地发现并抽取不相关的子逻辑:
(1)看看某个函数或代码块,问问你自己:这段代码高层次的目标是什么?
(2)对于每一行代码,问一下:它是直接为了目标而工作的吗?这段代码高层次的目标是什么?
(3)如果足够的行数在解决不相关的子问题,抽取代码到独立的函数中。
- 纯工具代码
- 其他多用途代码
- 通用代码
- 项目专有的功能
- 简化已有接口
- 按需重塑接口
- 过犹不及
一次只做一件事
关键思想
应该把代码组织得一次只做一件事情。
把想法变成代码
如果你不能把一件事解释给你祖母听的话说明你还没有真正理解它:
- 对着一个同事一样用自然语言描述代码要做什么
- 注意描述中所使用的关键词和短语
- 写出与描述所匹配的代码
少写代码
- 质疑和拆分你的需求
- 保持小代码库
- 熟悉开源项目