一、Duplicated Code(重复的代码)
1、最单纯的Duplicated Code就是同一个Class内的两个函数含有相同(expression)。采用的方法就是Extract Method(110)提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。
2、两个互为兄弟(sibling)的subclasses内含有相同表达式。只需对两个classes都使用Extract Method(110),然后再对被提炼出来的代码使用Pull Up Method(332),将它推入superclass内。如果代码之间只是类似,并非完全相同,那么就得运用Extract Method(110)将相似部分和差异部分割开,构成单独一个函数。然后你可能发现或许可以运用Form Template Method(345)获得一个Template Method设计模式。如果有些函数以不同的算法做相同的事,你可以择定其中较清晰的一个,并使用Substitue Algorithm(139)将其他函数的算法替换掉。
3、两个毫不相关的classes内出现Duplicated Code,你应该考虑对其中一个使用Extract Class(149),将重复代码提炼到一个独立class中,然后在另一个class内使用这个新class。但是,重复代码所在的函数可能属于第三个class,而另两个classes应该引用这第三个class。你必须决定这个函数放在哪儿最合适,并确保他被安置后就不会再在其他任何地方出现。
二、Long Method(过长函数)
1、要把函数变小,只需要使用Extract Method。找到函数中适合集在一起的部分,将它们提炼出来形成一个新函数。
2、对于函数内有大量的参数和临时变量,将运用Extract Method,并把许多这些参数和临时变量当作参数,传递给被提炼出来的新函数。
3、可以经常运用Replace Temp with Query来消除这些参数和临时变量。
4、Introduce Parameter Object和Preserve Whole Object则可以将过长的参数列变得更简洁一些。
5、如果向上面这么做,仍然有太多临时变量和参数,那就应该使出杀手锏:Replace Method with Method Object
确定要提炼的代码
1、寻找注释。通常是指出“代码用途和实现手法间的语义距离”的信号。
2、条件式和循环式也是提炼的信号。可以使用Decompose Conditional处理条件式。至于循环,应该将循环和其内的代码提炼到一个独立的函数中。