Extract Method
这个不难,用eclipse就可以解决大部分问题。需要注意的有几点:
1.有局部变量的情况,要作为参数传入目标函数
2.对局部变量再赋值,要将新值作为目标函数的返回值
3.如果目标函数需要返回多个值,则把它拆开,确保一个函数返回一个值
Inline Method
和Extract Method相反,在以下几种情况使用:
1.函数体极少(一行?),而且与函数名一样清晰易懂
2.有一堆组织不合理的小函数,需要inline到一个大函数中,然后在Extract Method
3.无用的间接层
Inline Temp
作为Replace Temp with Query的一部分使用,把对无用临时变量的赋值去除
Replace Temp with Query
太多的临时变量会造成无法Extract Method(原因应该是参数太多),所以这个步骤可能是在Extract Method前必不可少的。前提是临时变量只被赋值一次。如果赋值了多次,就用Split Temporary Variable或Separate Query from Modifier,确保它被赋值一次。
Introduce Explaining Variable
一个表达式可能很长,很难读懂。这时候引入用于解释的临时变量。在较长的算法中,也可以引入临时变量解释每一步的意义。注意:如果可以用Extract Method就不用Introduce Explaining Variable。仅当Extract Method难以进行时用。
Split Temporary Variable
一个临时变量只能承担一个责任。如果承担了多个责任,则需要引入另外的临时变量达到这个要求。
Remove Assignments to Parameters
与Split Temporary Variable类似,参数只表示“被传递进来的东西”。对参数赋值不会改变原引用的内容,只会使程序更加混乱。修改方法是给参数加final,但是一般情况下不必把所有参数都强制加final。
Replace Method with Method Object
当一个大型函数无法Extract Method时,可以尝试这种方法。主要原则是把大型函数中所有的临时变量都作为field放入一个新的class中。由于field可以被所有method使用,所以可以在该class内顺利的进行Extract Method,而不用在方法间传递参数。引入一个class,只包含一个函数,并通过构造函数把所有的参数传入,并赋值到field中。原先的函数仅起到一个delegate的作用。
Substitute Algorithm
这个方法让我匪夷所思,感觉就是不改变函数的任何外部行为的情况下,修改函数的内部实现。感觉叫替换函数的实现方式好像更准确些。对于这个重构方法,单元测试至关重要。
这个不难,用eclipse就可以解决大部分问题。需要注意的有几点:
1.有局部变量的情况,要作为参数传入目标函数
2.对局部变量再赋值,要将新值作为目标函数的返回值
3.如果目标函数需要返回多个值,则把它拆开,确保一个函数返回一个值
Inline Method
和Extract Method相反,在以下几种情况使用:
1.函数体极少(一行?),而且与函数名一样清晰易懂
2.有一堆组织不合理的小函数,需要inline到一个大函数中,然后在Extract Method
3.无用的间接层
Inline Temp
作为Replace Temp with Query的一部分使用,把对无用临时变量的赋值去除
Replace Temp with Query
太多的临时变量会造成无法Extract Method(原因应该是参数太多),所以这个步骤可能是在Extract Method前必不可少的。前提是临时变量只被赋值一次。如果赋值了多次,就用Split Temporary Variable或Separate Query from Modifier,确保它被赋值一次。
Introduce Explaining Variable
一个表达式可能很长,很难读懂。这时候引入用于解释的临时变量。在较长的算法中,也可以引入临时变量解释每一步的意义。注意:如果可以用Extract Method就不用Introduce Explaining Variable。仅当Extract Method难以进行时用。
Split Temporary Variable
一个临时变量只能承担一个责任。如果承担了多个责任,则需要引入另外的临时变量达到这个要求。
Remove Assignments to Parameters
与Split Temporary Variable类似,参数只表示“被传递进来的东西”。对参数赋值不会改变原引用的内容,只会使程序更加混乱。修改方法是给参数加final,但是一般情况下不必把所有参数都强制加final。
Replace Method with Method Object
当一个大型函数无法Extract Method时,可以尝试这种方法。主要原则是把大型函数中所有的临时变量都作为field放入一个新的class中。由于field可以被所有method使用,所以可以在该class内顺利的进行Extract Method,而不用在方法间传递参数。引入一个class,只包含一个函数,并通过构造函数把所有的参数传入,并赋值到field中。原先的函数仅起到一个delegate的作用。
Substitute Algorithm
这个方法让我匪夷所思,感觉就是不改变函数的任何外部行为的情况下,修改函数的内部实现。感觉叫替换函数的实现方式好像更准确些。对于这个重构方法,单元测试至关重要。