提取子类
问题
类具有仅在特定情况下使用的特性。
解决方案
创建一个子类并在这些情况下使用它。


为什么重构
你的主类有一些方法和字段,用于实现某个罕见的类用例。虽然这种情况很少见,但类要对此负责,将所有相关的字段和方法移到完全独立的类中是错误的。但是它们可以被移动到一个子类中,这正是我们在这种重构技术的帮助下所要做的。
好处
快速轻松地创建一个子类。
如果您的主类目前正在实现多个这样的特殊情况,您可以创建几个单独的子类。
缺点
尽管看起来很简单,继承如果必须分离几个不同的类层次结构,可能会导致死胡同。举个例子,你上过这门课
狗
根据狗的大小和皮毛,它们的行为不同,你可以梳理出两个等级:大小:
大
,媒介
而且小
毛:
光滑的
而且毛发粗浓杂乱的
一切看起来都很好,除了问题会突然出现,一旦你需要创造一个两者兼备的狗
大
而且光滑的
,因为您只能从一个类中创建对象。也就是说,您可以通过使用组成而不是继承(见策略模式)。换句话说,狗
Class将有两个组件字段,size和fur。您将从必要的类中插入组件对象到这些字段中。所以你可以创建一个狗
有LargeSize
而且ShaggyFur
.
如何重构
从感兴趣的类中创建一个新的子类。
如果需要其他数据来从子类创建对象,请创建构造函数并向其添加必要的参数。不要忘记调用构造函数的父实现。
找到父类构造函数的所有调用。当需要子类的功能时,用子类的构造函数替换父构造函数。
将必要的方法和字段从父类移动到子类。通过下推法而且下推场.首先移动方法会更简单。这样,字段在整个过程中都可以访问:在移动之前从父类访问,在移动完成后从子类本身访问。
在子类准备好之后,找到所有控制功能选择的旧字段。通过使用多态性来删除这些字段,以替换使用这些字段的所有操作符。一个简单的例子:在Car类中,您有字段
isElectricCar
取决于它,在加油()
方法:汽车要么加油,要么充电。Post-refactoring,isElectricCar
字段将被删除车
而且ElectricCar
类的实现加油()
方法。