编程可读代码的艺术
本书文章目录:
第一章:前言归纳
关键思想:代码应当易于理解
代码更优标准:可读性基本原理高于其他原则
- 他人对代码理解所需的时间最小化(能进行改动,并明白与其他代码部分的交互)
- 理解代码与代码架构效率等其他约束是否冲突
第二章:表面层次归纳
(1) 关键思想:把信息装进名字中
命名作为注释:对于参数、类、函数以下标准将会大幅提高代码的可读性。
专业的词:
- 如get 替换成fetch或者download,get 在编程中没有体现出太多的业务含义
- 如size(),替换成height()和numnodes()
明确使用时间,避免泛泛命名
- 如temp,retval->temp,场景应该只用于短期且临时的场景
具体代替抽象
- 如:explode将数组拆分为字符,与split有所区别
前后缀为名字附带更多信息:匈牙利表示法
名字长度:
- 长度参考规则:作用域、缩写或首字母缩写
- 利用名字格式表达含义:有目的的采用大写小或下划线
(2) 关键思想:减少歧义使用->”命名是否会被错误理解”
- 用min Max 来表示极限
- first last 表示范围
begin,end 表示包含的范围
对布尔的使用is,has,can 或should,让值更加明确,避免使用disabled等反义词
小心用户对特定值的期待,比如get()、size()是一个轻量化的操作,无复杂的逻辑
(3) 代码的审美
- 方法封装不规则的代码,有意义的顺序排列
- 相同的代码布局,按”列”代码更加易浏览
- 空行将大块代码分成逻辑上的”段落”
- 相关代码部分分组,形成代码块
- 代码风格一致
(4) 注释原则
关键思想:帮助读者尽可能了解的与作者一样多。
什么不需要注释
- 如:代码本身能够快速推断的无需二次注释
- 如:不好的名字加注释->重命名
代码记录思想
- 如:用于交给读者某些原理,避免无谓优化
- 如:为代码中瑕疵、常量做注释
站读者角度,想象对应的需求
- 如:最好能从命名体会表达的具体含义,而不是为了给不好的名字加注释,好代码>坏代码+好注释
- 如:全局或者总结的注释,记录整体的思路,类如何交互,数据如何在系统中流动
- 如:为代码里的瑕疵作好标记,比如todo,fixme,hack
- 如:常量加注释,尤其是数字,比如说这个数字是如何得出来的
- 如:站在读者的角度,为部分异常的情况写注释
(5) 更优注释
- 关键思想:注释应当有更高的信息\空间率
- 避免可能指代多个事务的代词,it、this。
- 尽量精确描述函数行为
- 可以使用输入输出例子说明
- 声明代码更高层次意图
- 嵌入式注释,针对性解释难易理解的函数及参数
- 简洁,丰富的含义。
第三章:简化循环和逻辑
(1) 把控制流变得易读
- 关键思想:使读者不用停下来重复阅读代码
- 条件语句中参数顺序:先处理正逻辑(改变值左、稳定值右)
- 重新排列if/else语句块:先处理简单、正确、有趣的情况
- 三目表达式,最好只在非常简单的情况下使用,否则使用if else会更好
- 避免使用(:?)、do/while、goto、等,会导致代码可读性变差。
- 从函数中提前返回,比如 可以遇到一个case就return ,对于复杂的嵌套也可以写成这个逻辑,嵌套的逻辑可以修改成线性的
(2) 拆分超长表达式
关键思想:将超长的表达式转换成易于理解的小块
- 解释变量
- 总结变量
- 德摩根定理:“分别取反、转换与/或”if(!(a && !b))=>if(!a||b)
滥用短路逻辑:
注意①:“or”操作符返回一个参数(它不会转换布尔值),x = a||b||c;可用来找出第一个为真的值。
注意②:比较begin/end值时,要注意<=与<
(3) 变量与可读性
- 变量个数限制:减少变量、无价值的临时变量、减少中间结果、减少控制流变量(done=true)…
- 注意:在循环中通过 break 或者 return 可以减少控制流变量的使用
- 变量作用域:移到合适的位置,而不是在开头定义
- 变量避免改动频繁:只写一次的变量更好
第四章:重新组织代码
- 把一般代码和项目专有的代码分开
- 应该把代码组织得一次只做一件事情
- 把想法变成代码,用自然语言描述解决方案
- 最好的代码就是没有代码
- 删除没用的代码
- 从项目中消除不必要的功能,不要过度设计
- 重新考虑需求,解决版本最简单的问题,只要能完成工作就行
- 经常性地通读标准库的整个API,保持对他们的熟悉程度–“不要重复造轮子”
第五章:测试
- 测试也应当具有可读性,以便其他程序员可以舒服地改变或者增加测试
- 对使用者隐去不重要的细节,以便更重要的细节会更突出
- 让错误消息具有可读性
- 又简单又能完成工作的测试值更好
- 每个测试的最高一层应该越简明越好,最好每个测试的输入/输出可以用一行代码来描述
- 如果测试失败了,它所发出的错误消息应该能让你容易跟踪并修正这个bug
- 使用最简单的并且能够完整运用代码的测试输入
- 给测试函数取一个有完整描述性的名字,以使每个测试所测到的东西很明确,不要使用test1(),而要使用test_这样的名字
- 最重要的是,要使它易于改动和增加新的测试
总结:
阅读文章内容,受益匪浅,作为一个编程人员的萌新,目前觉得相比较与操作上的工具熟练,一开始更为重要的是编程思想,代入编程思想的实际操作对于训练自己的代码能力以及开发效率有着不可或缺的作用。更重要的是,当踏入一个崭新领域时,让自己成为领域的一员尤为重要,正如:“ALL IN”的融入思想。评判代码优劣的标准有利于更加明确自己的后期对代码编程的角度和效率。减少人员时间浪费在代码阅读的成本对公司也是一种价值的体现,我也将以代码更加易读,效率更加高效作为自己编程的奋斗目标。