第三章:代码的坏味道
1、Duplicated Code (重复代码)
- 同一个类的两个韩硕含有相同的表达式时采用:Extract Method(提炼函数)
- 两个互为兄弟的子类内含有相同的表达式时:首先Extract Method(提炼函数) 然后使用 Pull Up Method(函数上移) 将它推入超类。
- 两个互为兄弟的子类代码只是类似,并非完全相同,那么可以运用Extract Method(提炼函数) 然后运用 Form Template Method(塑造模板函数) (PS:模板函数即子类重写的函数)
-两个毫不相干的类出现重复代码,应使用 Extract Class(提炼类) 把重复代码提炼成公共函数。
2、Long Method(过长函数)
- 分解函数: 每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中。并以其用途(非其实现手法)命名。
- 函数的长度: 在于函数 “做什么” 和 “如何做” 之间的语义距离。
Tips:当代码前有一行注释,就是在提醒你:可以将这段代码替换成一个函数!
- 分解函数常用方法:Extract Method(提炼函数) 、 Replace Temp with Query(以查询取代临时变量) 、Introduce Parameter Object(引入参数对象) 、Replace Method with Method Object(以函数对象取代函数) 、Decompose Conditional(分解条件表达式)
3、Large Class(过大的类)
- 通过运用 Extract Class(提炼类) 、 Extract Subclass(提炼子类) 把函数或者变量提炼出去
- 如果时GUI类,把数据和行为移到一个独立的对象去
4、Long Parameter(过长参数列)
- Replace Parameter with Method(以函数取代参数) 、Preserve Whole Object(保持对象完整(传递整个对象)) 、Introduce Parameter Object(引入参数对象)
5、Divergent Change(发散式变化)
指一个类受多种变化的影响
-通过运用 Extract Class(提炼类) 使其每个对象只受一个变化影响
6、Shotgun Surgery (散弹式修改)
指一种变化引发多个类相应的修改
- 通过使用Move Method(移动函数) 、Move Field(移动字段) 把所需要修改的代码放进同一个类,或者使用Inline Class(将类内联化) 把类合并到另一个类中。
7、Feature Envy(依恋情结)
指函数对某个类的兴趣高过对自己所处类的兴趣
- 原则:判断哪个类拥有最多被此函数使用的数据,然后就把这个函数通过移动函数和那些数据摆在一起。如果函数中只有一部分,应该运用提炼函数把这一部分提炼出去。
8、Data Clumps(数据泥团)
- 减少字段和参数的个数,提炼新对象。
9、Primitive Obsession(基本类型偏执)
- 数据对象化
- 小任务运用小对象
10、Switch Statement (switch 惊悚现身)
- 尽量少用Switch,尽量以多态替换Switch
15、Message Chains (过度耦合的消息连)
从一个对象请求另一个对象,然后再通过后者请求另一个对象。。。
- 可以通过提取函数、移动函数把这个函数推入消息连,或者使用Hide Delegate(隐藏委托关系)
22、Comments (过多的注释)
当你感觉二需要写注释的时候,请先尝试重构,试着让所有的注释都变的多余。
PS:部分省略