|
|
重构手法(二) —— 在对象之间搬移特性 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
在对象之间搬移特性
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的方法,只添加新的方法。

|
|
相关文章:相关软件: |
|