一、重构原则
1.函数应该放在它所使用的数据的所属对象内
2.重构新函数,有时候可以适当保留旧函数,让它去调用新函数,如果旧函数是一个public 函数 ,而我又不想修改其他类的接口,这是一个有用的手法
3.尽量少使用临时变量
二、如何重构
2.1 Duplicated Code (重复代码)
2.1.1
最为单纯的重复代码“同一个类的两个函数含有相同的表达式”,采用Extract Method 提炼出重复的代码
2.1.2
“两个互为兄弟的子类内含有相同的表达式”,对两个类都使用Extract Method ,然后对提炼出来的代码使用 Pull up将它推入超类
2.1.3
如果代码之间只是相似,并非完全相同,那么就Extract Method 将相似的部分和差异的部分割开,构成单独一个函数,然后运用 From Template Method 获得一个Template Method 设计模式。如果有些函数以不同的算法做相同的事,你可以选择其中比较清晰的一个,并使用Substitute Algorithm(替换算法) 将其他函数的算法替代掉。
2.1.4
如果两个毫不相干的类出现 Duplicated Code ,你应该考虑对其中一个类使用Extract Class ,将重复代码提炼到一个独立类中,然后在另一个类内使用新类
2.2 Long Method (过长函数)
百分之九十九的场合里,只需使用Extract Method 。
2.2.1
如何确定该提炼哪一段代码呢?一个很好的技巧:寻找注释。他们通常能指出代码的用途和实现手法之间的语义距离。如果代码前方一行注释,就是在提醒你,可以将这段代码替换成一个函数,而且可以在注释的基础上给这个函数命名。
2.2.2
条件表达式额循环常常也是提炼的信号,你可以使用 Decompose Conditional 处理条件表达式。至于循环和其内的代码提炼到一个独立函数中。