一、Duplicated Code(重复代码)
1、同一个类的两个函数含有相同的表达式:Extract Method提炼重复代码;
2、两个互为兄弟的子类内含有相同表达式:Extract Method提炼重复代码,使用Pull Up Method,推入超类;
3、代码只是类似,并非完全相同:Extract Method将相似部分和差异部分分割,构成单独函数。运用Form Template Method获得一个Template Method设计模式;
4、如果有些函数以不同的算法做相同的事,可以选择其中较清晰的一个,使用Substitute Algorithm将其他函数的算法替换掉;
5、两个毫不相关的类出现Duplicated Code:Extract Class提炼到一个独立类中,直接使用这个新类。
二、Long Method(过长函数)
如何确定:
1、寻找注释。每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途命名。对一行或一组代码都可以这么做,关键不在函数长短,而在于函数做什么和如何做。
2、条件表达式和循环
Decompose Conditional处理条件表达式。
方法:
Extract Method:找到函数中适合集中在一起的部分,提炼出来
如果函数内有大量的参数和临时变量,就会当做入参,可读性没有提升。可以运用Replace Temp with Query消除临时元素。
Introduce Parameter Object和Preserve Whole Object 则可以将过长的参数列表变得更简洁。
仍有太多临时变量和参数,Replace Method with Method Object
三、Large Class(过大的类)
Extract Class、Extract Subclass、Extract Interface
四、Long Parameter List(过长参数列)
向已有的对象发出一条请求就可以取代一个参数:Replace Parameter with Method
将来自同一个对象的一对数据收集起来,并以该对象替换它们:Preserve Whole Object。
如果缺乏合理的对象归属,可以制造出一个参数对象:Introduce Parameter Object
五、Divergent Change(发散式变化)
Divergent Change:某个类经常在不同的原因在不同的方向上发生变化。
找出某特定原因而造成的所有变化,提炼到另一个类中:Extract Class
六、Shotgun Surgery(霰弹式修改)
Shotgun Surger:每遇到某种变化,都必须在许多不同的类内做出许多小修改。如果修改的代码散布四处,很难找到,并且容易忘记。
所有需要修改的代码放进同一个类:Mvoe Method和Move Field
Divergent Change:一个类受多种变化的影响
Shotgun Surger:一种变化引发多个类相应修改
七、Feature Envy(依恋情节)
使用Extract Method把这一部分提炼到独立函数中,然后把函数移到该去的地方:Mvoe Method
八、Data Clumps(数据泥团)
Data Clumps:两个类中相同的字段、许多函数签名中相同的参数,总是出现
Extract Class提到到一个独立的对象,运用Introduce Parameter Object 或Preserve Whole Object 将很多参数列缩短,简化函数调用。
九、Primitive Obsession(基本类型偏执)
将单独存在的数据值替换为对象:Replace Data Value with Object
替换的数据值是类型码Replace Type Code with Class