在对象之间搬移特性
Move Method
如果一个方法与其source class之外的另一个class进行更多的交流(调用或者被调用),就在另一个class中建立一个类似行为的新方法。将原来的方法变成一个委托方法(delegating method),或者将其完全删除。
在搬移过程中,如果该方法需要使用source class的特性,有以下几种选择:
1、将该特性也移到target class
2、建立或使用一个从target class到source class的引用关系
3、讲source object 当作参数传给target method
4、如果需要特性是个变量,将它作为参数传给target method
Move Field
如果一Field被其source class之外的另一个class进行更多的用到。就在target class中建立一个新的Field,修改source field的所有用户,令它们改用新的field。
必须删除source field才能保证访问函数的确改变了操作对象。
Extrat Class
一个class做了过多的工作,就应建立一个新的class,将多余特性相关的Field和Method从source class搬移到target class。
一个class应该是一个清楚的抽象,处理一些明确的责任。
Inline Class
如果一个class没有做太多的事情(没有承担足够的责任),就将此class的所有特性搬移到另一个class中去,然后删除原class。
Hide Delegate
在server端(某个class)建立客户所需的所有函数,用以隐藏委托关系(delegation)。
可以在server端放置一个简单的委托方法,将委托关系隐藏起来。这样即便将来发生了委托关系上的变化,变化将被限制在server中,不会涉及到客户。
Remove Middle Man
某个class作了过多的简单委托动作。可以让客户直接调用委托类。
为了方便起见,我们可能想要保留一部分委托关系。此外我们也可能希望某些客户隐藏委托关系,并让另一些用和直接使用委托对象。基于这些原因,一些简单的委托关系也可能被留在原地。
Introduce Foreign Method
在使用server class中需要额外的方法,但是却无法修改此class。可以在client class中建立一个方法,并以这个server class实体作为第一引数(argument)。
如果发现自己为一个server class建立了大量的外加方法,或者发现有许多class都需要同样的外加方法,就不要使用此项重构,改用Introduce Local Extension。
Introduce Local Extension
在使用server class中需要一些额外的方法,但是却无法修改此class。可以建立一个新的class,使它包含这些额外的方法。让这个扩展class成为source class的subclass或wrapper(外覆类)。
所谓的local extension,是一个独立的class,但也是其extended class的subtype(这里的subtype不同于subclass:它和extended class并不一定存在严格的继承关系,只要能够提供extended class的所有特性即可)。
一般来说不要在extension class中覆写original class的方法,只添加新的方法。