圣诞大减价开始了!

提取子类

问题

类具有仅在特定情况下使用的特性。

解决方案

创建一个子类并在这些情况下使用它。

之前
提取子类-之前
提取子类-之后

为什么重构

你的主类有一些方法和字段,用于实现某个罕见的类用例。虽然这种情况很少见,但类要对此负责,将所有相关的字段和方法移到完全独立的类中是错误的。但是它们可以被移动到一个子类中,这正是我们在这种重构技术的帮助下所要做的。

好处

  • 快速轻松地创建一个子类。

  • 如果您的主类目前正在实现多个这样的特殊情况,您可以创建几个单独的子类。

缺点

  • 尽管看起来很简单,继承如果必须分离几个不同的类层次结构,可能会导致死胡同。举个例子,你上过这门课根据狗的大小和皮毛,它们的行为不同,你可以梳理出两个等级:

    • 大小:媒介而且

    • 毛:光滑的而且毛发粗浓杂乱的

    一切看起来都很好,除了问题会突然出现,一旦你需要创造一个两者兼备的狗而且光滑的,因为您只能从一个类中创建对象。也就是说,您可以通过使用组成而不是继承(见策略模式)。换句话说,Class将有两个组件字段,size和fur。您将从必要的类中插入组件对象到这些字段中。所以你可以创建一个LargeSize而且ShaggyFur

如何重构

  1. 从感兴趣的类中创建一个新的子类。

  2. 如果需要其他数据来从子类创建对象,请创建构造函数并向其添加必要的参数。不要忘记调用构造函数的父实现。

  3. 找到父类构造函数的所有调用。当需要子类的功能时,用子类的构造函数替换父构造函数。

  4. 将必要的方法和字段从父类移动到子类。通过下推法而且下推场.首先移动方法会更简单。这样,字段在整个过程中都可以访问:在移动之前从父类访问,在移动完成后从子类本身访问。

  5. 在子类准备好之后,找到所有控制功能选择的旧字段。通过使用多态性来删除这些字段,以替换使用这些字段的所有操作符。一个简单的例子:在Car类中,您有字段isElectricCar取决于它,在加油()方法:汽车要么加油,要么充电。Post-refactoring,isElectricCar字段将被删除而且ElectricCar类的实现加油()方法。

Baidu
map