如何编写可读性高的代码
2019-08-11
写代码不要只顾自己爽,也要兼顾代码的可读性。程序员之间的相互尊重体现在他们所写的代码中,他们对工作和职业的尊重也体现在代码上。
代码即架构。代码写的烂,不注重可读性,队友看了会问候你,估计也没人愿意接手你的烂摊子,隔一段时间后再看你也会骂娘。
从成本角度看,软件成本由开发成本和维护成本组成,而往往维护成本要远高于开发成本,这其中耗费的主要成本就是由于理解代码和修改代码造成的。
《编写可读代码的艺术》这本书主题是让代码变得更容易理解,确切的说,使别人用最短的时间理解你的代码。
对代码有追求的工程师都应该翻翻这本书。
摘录
一、表面层次的改进
- 把信息装到名字里。一个变量名就像是一个小小的注释,读者只通过名字就可以获得大量信息
- 选择专业的单词。比如 get 不如 fetch 具体(由上下文决定)
- 避免空泛的名字。比如 temp 和 i,除非有特殊的理由
- 使用具体的名字代替抽象的名字
- 给变量名带上重要的细节。比如在值为秒的变量后加上 second
- 为作用域大的名字采用更长的名字。在小的作用域可以使用短名字,不要使用项目特有的缩写
- 利用名字的格式来传递含义。比如有目的地使用大小写、下划线等区分变量,视团队规范而定
- 不会误解的名字是最好的名字。多审视名字是否会造成误解
- 很多英语单词在用来编程时是多义的,例如 filter、length、limit
- 当要定义一个值的上限和下限时,max 和 min 是很好的前缀
- 对于包含的范围,first 和 last 是好的选择
- 对于包含或排除范围,begin 和 end 很常用
- 为布尔值命名时,使用 is 或 has 这样的词来明确表示它是个布尔值,避免使用反义的词(例如 disable_ssl)
- 要小心读者对特定词的期望。例如,读者会期望 get 或 size 是轻量的方法
- 整洁的代码格式
- 使用一致的风格
- 把代码按列对齐可以让代码更容易浏览
- 选择一个有意义的顺序,并始终用这样的顺序。比如按字母顺序
- 用空行把大块代码分成逻辑上的段落
- 与团队保持一致的风格比“正确”的风格更重要
- 该写什么样的注释。注释的目的是尽量帮助读者了解得和作者一样多
- 什么时候不需要写注释。阅读注释会占用阅读真实代码的时间,注释也会占用屏幕上的空间,所以不要写没价值的注释
- 能从代码本身迅速推断的事实
- 不要给不好的名字加注释,而是应该把名字改好。好名字比好注释更重要
- 用代码记录你的想法
- 为什么代码要写成这样而不是那样的内在理由
- 代码中的缺陷,使用类似 TODO 这样的标记
- 常量为什么要用这个值
- 站在读者角度,去想象他们需要知道什么
- 为普通读者意料之外的行为加上注释
- 在文件或类级别上使用“全局观”注释来解释所有部分是如何一起工作的
- 用注释来总结代码块,使读者不致迷失在细节中
- 什么时候不需要写注释。阅读注释会占用阅读真实代码的时间,注释也会占用屏幕上的空间,所以不要写没价值的注释
- 写出言简意赅的注释。注释应当精确而紧凑
- 避免使用 it 和 this 这种可能指代多个事物的词
- 尽量精确描述函数的行为
- 在注释中用精心挑选的输入输出例子进行说明
- 声明代码的高层次意图,而非明显的细节
- 用嵌入的注释来解释难以理解的函数参数
- 用含义丰富的词来使注释简洁
二、简化循环与逻辑
- 把控制流变得易读。越自然越好
- 写比较语句时,改变的值写在左边,更稳定的值写在右边
- 重新排列条件判断语句中的语句块,优先处理正确的、简单的和有趣的情况
- 避免使用复杂的三目运算符、do while循环和 goto 这种会让代码可读性变差的编程结构
- 避免深嵌套的代码。应该改成更加线性的代码
- 使用保护语句提早返回可以减少嵌套
- 拆分超长的表达式。大多数人只能同时考虑 3-4 件事情
- 引入解释变量
- 使用德摩根定理优化逻辑表达式
- 变量和可读性
- 减少变量。尤其是不能改进可读性的临时变量
- 缩小变量的作用域。尽量避免全局变量
- 只写一次的变量更好。final类型、常量使得代码更容易理解。操作一个变量的地方越多,越难确定它的当前值
三、重新组织你的代码
- 主动抽取不相关的子问题。把一般代码和项目专有的代码分开。这样可以使你关注小而定义良好的问题
- 一次只做一件事。尝试把难读的代码的所有任务列出来,部分任务可拆成单独的函数或类,或者成为函数中的逻辑段落
- 采用橡皮鸭调试法,把想法变成代码。用自然语言描述程序然后用这个描述来帮助写出更自然的代码
- 少写代码。代码需要开发、测试、写文档和维护,代码越多,债务越多,维护越麻烦
- 从项目中清除不必要功能,不要过度设计
- 重新考虑需求,解决当前版本最简单的问题,只要能完成工作即可
- 经常性通读标准库的 API ,保持对它们的熟悉程度,多重用它们
四、可读代码与测试
- 最好每个测试的输入和输出可以用一行代码来描述
- 如果测试失败了,它所发出的错误信息能让你容易跟踪并修复这个问题
- 使用最简单的并且能够完整运用代码的测试输入
- 给测试函数取一个有完整描述性的文字,以使每个测试所测到东西很明确
- 要易于改动和增加新的测试
- 不要对测试关注过度,它应该是项目的一个方面而不是主导。比如不要追求 100% 的测试覆盖率
Post TOC
Comments