重构十二:处理继承关系

470 阅读3分钟

处理继承关系

主要是函数和字段在继承体系中的上下调整

1.函数上移(Pull Up Method)

  • 避免重复代码
  • 如果某个函数在各个子类中的函数体都相同,则函数上移适合此场景
  • 如果两个函数工作流程大体相似,但是先细节略有差异,则考虑使用模板方法构造出相同的函数,再提升他们

2.字段上移(Pull up Field)

  • 各子类拥有重复的属性,,或者函数对他们的使用方式都非常相似,则提升至超类去

3.构造函数本体上移(Pull Up Constructor Body)

  • 子类中存在公共代码,而且操作的是同一个字段,则可以考虑将构造函数和此字段同时上移

4.函数下移(Push Down Method)

  • 如果超类中某个函数只与一个或少数几个子类有关,那么最好将其挪走,放在真正关心它的子类中去

5.字段下移(Push Down Field)

  • 如果一个字段只被一个子类或一小部分子类用到,则将其搬移到需要该字段的子类中去

6.以子类取代类型码(Replace Type Code with Subclass)

  • 表现相似但有不同的东西
  • 大多数时候,有类型码来区分就足够了。但是,我们可以引用子类,用继承的方式实现,让子类本身只执行自己的逻辑,这也是多态的一个应用,也就不需要每个方法都先去判断一下类型码
  • 只需要在获取子类对象时,适用类型码进行区分,构造出一个工厂函数来,把选择器逻辑放在工厂方法中

7.移除子类(Remove Subclass)

  • 随着软件的演化,子类所支持的变化可能被搬移到别处,甚至完全去除,这时子类就失去了价值
  • 移除子类,将其替换成超类的一个字段

8.提炼超类(Extract Superclass)

  • 如果两个类在做相似的事,可以利用基本的继承机制把他们相似指出提炼到超类,可以使用字段上移搬移数据,函数上移搬移行为
  • 首选方案,即便错了,还有“以委托取代超类”这瓶后悔药

9.折叠继承体系(Collapse Hierarchy)

  • 随着继承体系的演化,一个类和其超类已经没太大差别时,不值得在作为独立的类存在,合并。

10. 以委托取代子类(Replace Subclass with Delegate)*

  • 改善继承的短板,不能以多种分类方式区分子类
  • 继承给类之间引入了非常紧密的关系,在超类上做修改,都有可能破坏子类
  • 委托关系更加清晰,耦合更少
  • 原则:对象组合由于类继承
  • 当使用继承出现问题时,就可以使用委托了
  • 和策略模式类似,加了一个叫做委托类的中间层,在子类的构造方法中初始化此委托类

  • 将行为从子类中搬移到委托类中,就可以修改工厂函数,令其返回超类实例,删除子类

  • 取代继承体系,去除整个继承体系

    • 找个简单的子类先为它建立一个委托类

11.以委托取代超类

  • 委托:就是创建一个中间层委托类,然后在源类的构造函数中将对应的委托类创建
  • 源类中也有一个字段来表示委托类
  • 如果子类与超类之间耦合过强,超类的变化很容易破坏子类的功能,则可以使用“以委托取代超类”
  • 委托手法本质就是将被委托的类作为一个委托组件放在源类中