07 在对象之间搬移特性

Wu Jun 2019-12-25 15:59:04
13 重构 > 1 重构-改善既有代码的设计

1 Move Method (搬移函数)

你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或者被后者调用。
在该函数最常引用的类中建立一个有着类似行为新函数。将旧函数变成一个委托函数,或者将旧函数完全移除。

动机

如果一个类有太多行为,或与另一个类高度耦合,搬移函数,使类更简单。

做法

迁移过程中考虑多态的情况和访问权限的问题,若果迁移方法被引用过多,将旧函数变成委托函数,否则将其完全移除。

2 Move Field (搬移字段)

你的程序中,某个字段被其所驻类之外的另一个类更多地用到。
在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。

动机

按需

做法

3 Extract Class (提炼类)

某各类做了应该由两个类做的事。
建立一个新类,将相关的字段和函数从旧类搬移到新类。

动机

后期开发中类的子类化如果只影响类的一部分特性,原来的类需要分解。

做法

4 Inline Class (将类内联化)

某个类没有做太多事情。
将这个类的所有特性搬移到另一个类中,然后移除源类。

做法

如果目标类访问权限只在源类内部,如private嵌套类,可放心内联。如果目标类访问权限过大,可先修改类名,让编译器替我们检查目标类被引用的地方。

5 Hide Delegate (隐藏“委托关系”)

客户通过一个委托类来调用另一个对象。 在服务类上建立客户所需求的所有函数,用以隐藏委托关系。

动机

封装。

在委托关系过少的情况下可以使用此手法,如果委托关系过多,使用移除中间人。

做法

建立委托函数,调整客户调用之

6 Remove Middle Man (移除中间人)

某个类做了过多的简单委托动作。
让客户直接调用受托类。

动机

与5相反,尺度问题。

7 Introduce Foreign Method (引入外加函数)

你需要为提供服务的类增加一个函数,但你无法修改这个类。
在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。

动机
做法

8 Introduce Local Extension (引入本地扩展)

你需要为服务类提供一些额外函数,但你无法修改这个类。
建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。

动机
做法

新建类,创建转型构造函数,加入新特性,替换