第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.
当发现有个函数与其所在类之外的另一个类进行更多的交流(调用后者,或者被后者调用),这样可能形成一个高耦合关系时,最常用的方法将该函数移植到另一个类中,把旧函数变为一个委托函数,或者直接删除.
当需要使用原类的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.
相关文章推荐
- 《重构:改善既有代码的设计》(四) 第7章 在对象之间搬移特性
- 重构改善既有代码设计----- 在对象之间搬移特性
- 重构:二、在对象之间搬移特性
- 重构方法之对象之间搬移特性
- 3、在对象之间搬移特性
- 在对象之间搬移特性
- 在对象之间搬移特性之六 :Remove Middle Man(移除中间人)
- 重构手法之在对象之间搬移特性【1】
- 第3章 在对象之间搬移特性(1):搬移函数和字段
- 第3章 在对象之间搬移特性(2):提炼类、类的内联化
- 第七章 在对象之间搬移特性
- 读书笔记 ------ 重构 -> 在对象之间搬移特性
- 在对象之间搬移特性---搬移函数
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性【链接:http://www.cnblogs.com/baochuan/archive/2012/04/01/2427199.html】
- 重构改善既有代码的设计--在对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- 在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
- 在对象之间搬移特性(一)
- 在对象之间搬移特性(二)
- 重构改善既有代码的设计--在对象之间搬移特性