您的位置:首页 > 其它

第7章:对象之间的搬移

2008-06-04 18:53 148 查看
1.Move Method

当发现有个函数与其所在类之外的另一个类进行更多的交流(调用后者,或者被后者调用),这样可能形成一个高耦合关系时,最常用的方法将该函数移植到另一个类中,把旧函数变为一个委托函数,或者直接删除.

当需要使用原类的Feature时,一般可以采用以下4中方法.(1)将这个Feature也移植到另一个类中(2)建立或试用一个从新类到旧类的引用关系.(3)将旧类作为参数传到新类中.(4)如果参数是个变量,直接作为参数即可.

2.Move Field

在程序中,发现一个值域与其所在之外的另一个类更多的利用到,在新类中建立一个new field.然后全部替换掉.

有一个常用的方法,首先Self-Encapsulate(自我封装),然后就可以很轻松的使用Move Method将函数移动到新类中了.

3.Extract Class

听起来很简单,如果一个类做了两个类的事情,那么建立一个新类,将相关值域和函数移植到新类中.

类,应该是一个清晰的抽象,处理一些明确的功能.

When:一个很有用的自测方法,如果我移动了一些值域或者函数,会发生什么事情??其他的值域或函数会不会因此为变得无意义.另一个方法往往是开发后期出现的信号,Class的Subtyped方式,当发现subtyping只影响class的部分特性时,那就就意味该分解原来的Class.

一般情况下,不要一开始就把新类暴露出来,可以使用委托将新类隐藏.

Ectract Class是改善开发一种常用的技术,因为它可以使提炼后的两个类同时加锁,但这将面临事务的问题.

4.Inline Class

如果一个类没有做太多的事情,将这个类的所有特性转移到另一个类中,然后移除原类。

Michanics

1.在obsorbing class上申明所有Source Class的Public协议,并将申明的所有函数委托只Source Class.

2.将所有对Source Class的引用点,改为对Obsorbing Class的引用。

3.用Move Method和Move Field将Source Class的所有特性全部搬移到Obsorbing Calss中。

4.删除Source Class.

5.Hide Delegate

客户程序直接调用Server Object的delegate class 时,在Server Object中建立客户所需的所有函数,用以隐藏委托关系。

【封装】是面向对象的一个重要特征。意味着每个对象都要尽可能的少了解系统其他部分,这样一旦发生变化,需要了解这一变化的对象就会减少。

Mechanics

1.对于每个委托关系中的函数,在Server Object中建立一个简单的委托函数。

2.调整客户程序,使它只调用Server Object中的函数。

6.Remove Middle Man

这个方法和Hide Delegate是相反的。当每个类做了太多的简单委托动作时,这个类就变成一个中间类了,此时应该让客户直接调用Delegate Class(委托类)

Mechanics

1.创建一个新函数,让客户直接取得委托类。

2.将所有委托函数删除掉,并在客户中对委托函数的调用全部改为对委托类的调用。

7.Introduce Foreign Method

当使用的Server Class学要一个新函数,但无法修改此类时。在Client Class中建立一个函数,并以Server Class实体作为第一参数

Mechanict

1.在Client Class中定义一个函数,用来提供需要的功能

2.将Server Class作为第一参数。

3.在有可能的情况下,将添加的函数移至Server Class中。

8.Introduce Local Extension
所使用的Server Class需要添加额外的函数(一般在2个以上),但又无法修改此类,建立一个新Class,使它包含这些额外的函数,并将这个Class定义为Source Class的SubClass或者Wrapper。

通常首先考虑使用SubClass,因为这样做工作量比较少,但它必须在Source Class创建时将其替换掉。如果对象创建后使用SubClass Local Extension,可能出现2个对象都包含了元数据。这时则应该使用Wrapper,因为对元数据的修改会影响到2个Class。

Mechanics
1.建立一个Class,将它作为Source Class的SubClass或者Wrapper.
2.在Extension Class中加入转型构造函数.
(1)SubClass时,就是在SubClass的构造函数中,调用适当的Server Class的构造函数。
(2)Wrapper时,就是将Source Class对象赋值给用于保存委托关系的Field.
3.在新Class中加入新特性。
4.根据需要将Source Class替换为新Class.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: