简介
重构的前提:先构建安全网,然后在不改变功能外在行为的前提下重构。
重构的心法:旧的不变,新的创建,一步切换,旧的再见。
代码坏味道列表
有些重构手法没有包含在这份列表中。
Duplicated cod 重复代码
重构方式
- Extract Method:同一个类中有重复代码,则提取公共函数;
- Extract Class:如果某个类做了应该由两个类做的事情,那么创建一个新类,将相关的字段和函数从旧类搬移到新类;
- Pull up Method:如果兄弟类中有重复代码,则提取公共函数后,再pull up method到父类;
- Form Template Method:如果兄弟类之间只是代码类似,并非完全相同,则运用Extract Method将相似部分和差异部分分隔开,然后使用模板方法设计模式,将共同的部分放在父类中,差异部分在子类中分别实现;
- 如果是不相关的两个类有重复的代码,那么可以抽取到第三个类中,如果放在两个类中的某个类,具体视情况而定。
Long Method过长函数
- Extract Method:拆分成若干函数。每当感觉需要以注释来说明的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。
- Replace Temp With Query以查询取代临时变量:有时临时变量或表达式可能在类中的多个函数中被使用,那么此时可以将变量或者表达式抽取为了类中的查询函数,供多个函数一起使用。
- Replace Method with Method Object以函数对象取代函数:如果有一个大型函数,其中对局部变量的使用使得无法采用Extract Method。那么就将这个函数放进一个单独对象中,此时局部变量就成了对象内的字段。然后就可以在同一个对象中将这个大型函数分解为多个小型函数。
- Decompose Conditional分解表达式:如果有一个复杂的条件(if-then-else)语句,那么就将3个段落分别提炼为独立函数。
Large Class 大类
- Extract Class:如果某个类做了应该由两个类做的事情,那么创建一个新类,将相关的字段和函数从旧类搬移到新类;
- Extract subClass:如果类中的某些特征只被某些实例用到,那么就新建一个子类,将部分实例使用的特征移到子类中。
- Extract Interface:如果有多个类使用某个类接口中的同一个子集,或者两个类的接口有部分相同,那么就将相同的子集提炼到一个独立接口中。
- Replace Data Value with Object以对象取代数据值:如果数据项要和其他数据以及行为一起使用才有意义,那么就应该将数据项封装为对象。
Long Parameter List 过长参数列表
将参数封装成结构或者类。
- Replace Parameter with Method以函数取代参数:对象调用某个函数,并将所得结果作为参数