什么时候需要重构,当你在项目代码里面嗅到这个味道的时候,就要进行重构。
首个介绍的味道是重复代码的味道。
它表现出来的特征是这些:
1.一个类里面,两个函数中,含有相同的代码,类似的代码;或者三个函数中,含有相同的代码,类似的代码。这是重复代码的味道。
2.两个互为兄弟的子类内含有相同的表达式。这也是重复代码的味道。
3.两个不相关的类,出现了重复代码。这也是重复代码的味道。
如何处理,如何重构
1.对于两个函数,出现重复代码,使用Extract Method方法。把某段代码组织到一个新的函数中,然后,将原来函数的某段代码替换为对新函数的调用。
Extract Method手法介绍
使用Extract Method手法处理原函数某段重复代码时,会面遇到如下几种情况:
a.该段代码没有局部变量。
对于a,直接将代码复制到一个新建的函数体中。
b.该段代码有局部变量。
如果,在段代码中,只是读取局部变量,并没有修改局部变量;或者,局部变量是个对象,这段代码只是调用该对象的某个方法。那么,只需要把这个局部变量当作新建函数的参数便可。
c.该段代码对局部变量再赋值。
被提炼代码段中,对源函数的某个局部变量进行了修改。
c1.并且,在被提炼代码段的后面,使用该修改后的局部变量。
这个处理手法是这样:
1.局部变量被修改后的结果作为新建函数的返回值。
2.源函数接收新建函数的返回值。
遵守的准则:一个函数,只有一个返回值。
------------------------------------------------------------------------------------------
2.两个互为兄弟的子类内含有相同的表达式。这也是重复代码的味道。
处理方式,首先使用Extract Method手法;然后,再对Extract Method手法处理后的结果使用Pull up Method,把提炼出来的代码推入超类。
Pull up Method(函数上移)手法介绍
1.如果,兄弟类中,出现了相同的函数体。那么,在超类中新建一个函数,存放函数体,在各个子类冲调用该新建函数。
2.如果,兄弟类中,出现了相同的函数体,但是,该函数体还使用了所在类的一个字段,可以把该字段也提升到超类。
3.如果,兄弟类中,出现了相同的函数体,并且该函数体,还调用了所在类的一个函数。那么,可以考虑,在超类中声明一个抽象函数,由子类实现。然后,在新建的函数体中,调用超类声明的抽象函数。
4.兄弟类,有时候,不是出现完全相同的函数体,但是,是相似,这些函数体可以通过某种形式的参数调整,最后将相似的多个函数体调整为一个可以使用某种参数表示新函数。
-------------------------------------------------------------------------------------------------------
3.Form Template Method
两段函数体,它们以相同的顺序执行类似的操作,区别只是每个具体操作是不同的。那么,这是执行顺序的相同,也可以列为重复代码。
---------------------------------------------------------------------------