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.