前面的步骤写着写着就觉得很无趣,只见树木不见森林,但是至少要大概知道有这种方法,合适需要使用这种方法,然后可以来查阅怎么使用,用多了自然会了。 但是这些步骤还会太简单,真正在重构的时候,实际上是没这么简单的,相互之间依赖太深。

Tease Apart Inheritance(梳理并分解继承体系)

某个继承体系同时承担两项责任。 建立两个继承体系,并通过委托关系让其中一个可以调用另一个。

这个不好说清楚,记忆中 JanusGraph 源码可能有这种继承体系。JanusGraph 继承类 来自 Tinkerpop 的 图元素体系。Tinkerpop 自己也有一套体系,例如 vertex 和 edge 都继承自 element。

首先要发现问题:如果继承体系中的某一特定层级上的所有类,其子类名称都以相同的形容词开始,那么这个体系很可能就是承担着两项不同的责任。

例如有个 Deal 类表示交易,有 ActiveDeal 和PassiveDeal 两个子类。有人突然想基于它做一个表格展示,于是写了个 TabularActiveDeal 和 TabularPassiveDeal 两个子类。 这就出现了继承体系不纯,承担两项责任,一开始没啥,后来发现很难添加新的Deal。

首先我们应该新建 Tabular 相关接口 PresentationStyle,并且引用一下 Deal 对象。然后开始 Move Filed 和 Move Method。

Convert Procedural Design to Objects (将过程化设计转化为对象设计)

你手上有一些传统过程化风格的代码。 将数据记录变成对象,将大块的行为分成小块,并将行为移入相关对象之中。

这是面向对象的思维转换:

class Order
    实体类属性

class OrderLine
   实体类属性
   
class Calculator
    computePrice(Order):
    computeTaxes(Order)

转化为

class Order
	computePrice():
    computeTaxes()

class OrderLine
	computePrice():
    computeTaxes()

Separate Domain from Presentation (将领域和表述/显示分离)

这个描述有 GUI 操作,暂且跳过

Extract Hierarchy(提炼继承体系)

你有某个类做了太多工作,其中一部分工作是以大量条件表达式完成的。 建立继承体系,以一个子类表示一种特殊情况。这里需要用到工厂模式。