敏捷之旅敏捷转型程序员

读《编写可读代码的艺术》

2018-01-06  本文已影响51人  而立不惑之年

《编写可读代码的艺术》是与Clean Code相似的书,提供改善“丑陋”代码的技巧。本书193页,共16章内容。


图书封面

本书分为四个部分:

关键思想:代码应当易于理解

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

1 表面层次的改进

包括好的名字,好的注释,还有好的格式

1.1 把信息装进名字里

1.1.1 选择专业的词

反例: 函数名 GetPage(url)
正例: FetchPage()、DownloadPage()
反例: class BinaryTree的方法Size() VS
正例:Hight() NumberNodes(),MemoryBytes()
反例: class Thread的方法Stop()
正例: Kill() Pause(),Resume()

1.1.2 避免泛泛的名字

关键思想:清新和准确比装可爱好
迭代器变量,应该有明确指向

选择更有表现力的词

避免tmp和retcode泛泛的名字
retcode建议:retcode没有包含更新信息。描述该变量的值的名字代替它。

retcode改为sum_squares
tmp建议:tmp这个名字只应用于短期存在且临时性为其主要存在因素的变量。
tmp改为user_info
如果需要使用tmp,也需要指明tmp_file,或者tmp_data.
迭代器变量,应该有明确指向
i,j,k改为clubls_i/ci,members_i/mi,users_i/ui

1.1.3 用具体的名字代替抽象的名字

名字更具体而不是抽象
反例: 函数ServerCanStart:检测服务是否可以监听某个端口
正例: CanListenOnPort()
DISALLOW_COPY_AND_ASSIGN更好

1.1.4 给名字附带更多的信息

1、一个变量名就是一个小小的注释
反例:string id ; //example:"0x128a232b"
正例:string hex_id;
2、变量名带单位

带单位的值
3、附带额外信息
附带额外信息

1.1.5 决定名字的长度

名字隐含约束就是不能太长。

1.1.6 利用名字的格式表达含义

利用下划线,大小写或者连字符可以装载更多含义。 在google的C++代码规范中:

1.1.7 小结

1.2 不起误解的名字

关键思想:要多问自己几遍,“这个名字会被别人误解成其他含义吗?“要仔细审视这个名字

反例: Filter("years <= 2010") 挑出还是减掉?
反例: Clip(text,length)是截断到,还是去掉?
正例:使用min和max表示极限
正例:使用first和last表示包含的范围
正例:使用begin和end表示包含/排除的范围

布尔型命名
正例:加上is,should,has,can,use变得含义更明确
正例:避免使用反义名词:bool disable_ssl=false;

1.3 审美

布局的三个原则:

  1. 使用一致的布局,让读者很快习惯这种风格。
  2. 让相似代码看上去相似。
  3. 相关的代码分组,形成代码块。
审美

1.4 注释

关键思想:注释的目的就是尽量帮读者和作者了解一样多

注释
1、什么不需要注释

2、记录你的思想

1.5 写出言简意骇的注释

言简意骇

关键思想:注释应该有很高的信息/空间率

2 简化循环和逻辑

2.1 把控制流变得易懂

关键思想:把条件,循环以及其它对控制流的改变做的越“自然”越好。运用一种方式使得读者不用停下来重读你的代码

比较的左侧 比较的右侧
被询问的表达式,它的值倾向于不断变化 用来作比较的表达式,它的值倾向于常量

if(object == null) 还是 if(null == object)?

2.2 拆分超长的表达式

1、解释变量
引入变量来解释子表达式。
2、最小化嵌套
用一个变量来代替一段代码。
3、使用德摩根定理

分别取反,转换与或
4、滥用短路原理
滥用短路
5、使用德摩根定理
6、复杂表达式,提取函数,提前返回

2.3 变量和可读性

1、减少变量
没有价值的变量
减少中间结果
减少控制变量

2、变小变量的作用域
让你的变量对尽量少的代码行可见
C++ if的作用域

差异?
3、只写一次的变量更好
操作一个变量的地方越多,越难确定他的值。

3 重新组织代码


3.1 抽取不相干的子问题

抽取不相干的子问题,建议:积极地发现并抽取不相干的子逻辑
我们指:

  • 看到某个函数或者代码块,问自己:这个代码的高层次目标是什么?
  • 对于每一行代码,问:他是直接为了目标而工作吗?这段代码高层次的目标是什么?
  • 如果足够的行数在解决不相干的子问题,抽取代码到独立的函数中。

3.2 一次只做一件事

整理碎片

3.3 把想法变成代码

爱因斯坦:如果你不能把一件事情解释给你祖母听的话说明你还没有真正理解他

3.4 少写代码

关键思想:最好读的代码就是没有代码。

代码库大小和维护难度

冒险、兴奋-绝地武士追求的并不是这些。--尤达大师

4 精选话题

4.1 测试与可读性

可测试性差的代码带来的设计问题
可测试性好的代码带来优秀设计

4.2 设计并改进

通过一个例子来说明:演进式改进的过程。

小结

本书2018读的第一本书,大概花了10个多小时。本书在代码可读性的命名,布局,注释,循环控制,抽取函数,表达式,可测试性方面都有很不错的建议,值得内部分享和学习。

上一篇 下一篇

猜你喜欢

热点阅读