重构七:在对象之间搬移特性

155 阅读2分钟

决定把责任放在哪儿,通常使用Move Method和Move Field简单地移动对象行为。

常用方法:Extract class ,Inline Class , Hide Delegate, Remove Middle Man,Introduce Foreign Method, Introduce Local Extension

Move Method (搬移函数)

  • 有个一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合。

  • 有个函数与其所驻类之外的另一个类进行更多交流,调用后者,或者被后者调用,-> 在该函数中创建一个类似行为的方法,将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。

  • 当需要 使用源类的特性时,有四种选择

    1. 将这个特性也移到目标类
    2. 建立或使用一个从目标类到源类的引用关系
    3. 将源对象当做参数传给目标函数
    4. 如果所需特性是个变量,将它作为参数传给目标函数

Move Field(搬移字段)

  • 在你的程序中,某个字段被其所驻类之外的另一个类更多的用到。
  • 在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段
  • 使用Self-Encapsulation自我封装,在get/set函数中调用目标类字段。

Extract Class(提炼类)

  • 建立一个新类,将相关的字段和函数从旧类搬移到新类。

Inline Class(将类内联化)

  • 将这个类的所有特性搬移到另一个类中,然后移除原类

Hide Delegate (隐藏【委托关系】)

  • 客户直接调用其server object 的delegate class

    img

Remove Middle Man(移除中间人)

  • 某个class做了过多的简单委托动作,让客户直接调用delegate类
  • 与Hide Delegate相反,当委托过多时,就要考虑移除部分或者全部委托关系

Introduce Foreign Method(引入外加函数)

  • 你所使用的server class需要一个额外函数,但你无法修改这个class
  • 在client class中简历一个函数,用来提供你需要的功能。
  • 这个函数不应该取用client class的任何特性,如果他需要一个值,把该值当做参数传给他
  • 以server class实体作为该函数的第一个参数。

Introduce Local Extension(引入本地拓展)

  • 你说使用的server class需要一些额外函数,但你无法修改这个class
  • 建立一个新class,使他包含这些额外函数,让这个拓展品称为source class的subclass或wrapper
  • 外加函数超过两个时使用