重构:改善既有代码的设计(第二版)–代码的坏味道
重构的前两章讲了个重构卖票逻辑的小例子,第二章讲了重构的一些介绍和必要性,以及重构在软件开发过程中的位置.
第三章是关于什么样的代码需要重构,内容比较多也比较散,先行记录下这部分的内容,后续章节也和这部分有很多关联性,先打个结.
这部分内容经常让我发现我自己的代码也会写成这个样子,堆一大堆代码上去,难以阅读,难以修改,难以处理.
第三章不少东西我都挺有共鸣的,也写写我自己的想法.
第三章:代码的坏味道
1. 神秘命名(Mysterious Name)
编程中最难的两件事:命名和缓存失效.
起一个看起来和另一个变量或者函数类似的名字,一眼下去看不清楚你这个变量到底是为了什么,往往意味着他的含义和功能是不明确的.看起来是命名困难,实际上隐含了函数/类/变量的功能定义不充分.
所以当命名发生了困难的时候,导致你起的名字不能让人(起码是你自己)一目了然的时候,先别凑活着起一个名字算了,而是想想,是不是需要这个东西,导致你起名困难的原因是什么.(章北海他爹:要多想,我只能告诉你要多想)
2. 重复代码(Duplicated Code)
永远别复制粘贴代码,一是你不能为粘贴过来的代码负责,另一方面,修改时需要往往要修改多处,或者需要权衡是否进行修改,这种成本是远远高于复制来的那一下的省事的.
3. 过长函数(Long Function)
函数越长,他的功能就越不纯粹,就越复杂,就越容易出错.很容易理解的事情是越短的函数出错的可能性越低,因为它足够简单.简单就是稳健.
最好能够把函数的功能尽可能抽象到函数当中,写出一个长的函数时,就要想着怎么对他进行一个抽象能更好的让人读懂它.
自解释的代码往往就是比较安全的写法.
需要说明的是,自解释不代表着不需要代码,这两个事情没啥关系.
4. 过长参数列表(Long parameter List)
参数列表长,意为着什么呢?
意味着传入的参数是没有经过组织的,可以考虑用对象替代过长的参数.
5. 全局数据(Global Data)
非常之不安全的东西,随时可能被引爆的定时炸弹.慎用.
6. 可变数据(Mutable Data)
变量的应用传递会导致在非显式的地方变量被修改,这可能会出乎原有的调用意图.
(函数式编程我并不了解)
7. 发散式变化(Divergent Change) 8. 霰弹式修改(Shotgun Surgery)
修改一个模块时,需要配套修改很多处代码.最好能收敛这样的变化逻辑,或者通过流程来固定变化时对其他代码的影响.
9. 依恋情结(Feature Envy)
10. 数据泥团(Data Clumps)
互相依存的数据或结队出现的数据应该被定义为类.不然就必须像是捧着一堆玻璃球一样一个个的处理,但是他们本该是在一起的,能用一个小筐子把它们都装起来.
11.基本类型偏执(Primitive Obsession)
常用自定义类型应当定义出自己的类.
比如我以前经常用的经纬度,多边形,我常常用字符串的方式存储他,用浮点数的方式处理它,但是他值得一个自己的类,还能配有相应的方法.
12.重复的switch(Repeated Switches)
switch–>多态?
python的多态我是用的非常不习惯,他有一种不是严格的多态的感觉,很随便.
13.循环语句(Loop)
管道操作代替循环
filter,map
14. 冗赘的元素(Lazy Element)
额外的类,不需要的复杂设计等等,通过折叠继承体系处理(超类和子类之间无太大区别,将它们合为一体.)
15. 夸夸其谈通用性(Spechlative Generality)
如果函数的唯一用户是测试用例(更可怕的是没有用户的),就该被删除掉
另一个情况是功能被迁移了,原有的函数或者类被废弃了,它变成了代码中的尸体,散发出腐烂的味道,但是处于某种原因(懒,危险)的原因,他被留在了原地,日复一日他就成为屎山的一部分,更加的难以被处理.
有种方法是你意识到了这个方法被遗弃了,你应该让任何使用这个方法的地方抛出异常,如果系统能够正常的运行,你就能放心大胆的删除这部分代码了.
16. 临时字段(Temporary Field) 17. 过长的消息链(Message Chains) 18. 中间人(Middle Man) 19. 内幕交易(Lnsider Trading) 20. 过大的类(Large Class) 21. 异曲同工的类(Alternative Classes with Different Interfaces) 22. 纯数据类(Data Class)
23 被拒绝的遗赠(Refused Bequest)
子类并不需要从父类继承来的东西,或者只需要一部分.
24.注释
注释不是写出垃圾代码的理由,不能因为写好了注释就能理直气壮的放一堆垃圾代码.注释可以作为文档,或者注释可以用来说明注意事项.