前面的步骤写着写着就觉得很无趣,只见树木不见森林,但是至少要大概知道有这种方法,合适需要使用这种方法,然后可以来查阅怎么使用,用多了自然会了。 但是这些步骤还会太简单,真正在重构的时候,实际上是没这么简单的,相互之间依赖太深。
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(提炼继承体系)
你有某个类做了太多工作,其中一部分工作是以大量条件表达式完成的。 建立继承体系,以一个子类表示一种特殊情况。这里需要用到工厂模式。