- 1 Move Method (搬移函数)
- 2 Move Field (搬移字段)
- 3 Extract Class (提炼类)
- 4 Inline Class (将类内联化)
- 5 Hide Delegate (隐藏“委托关系”)
- 6 Remove Middle Man (移除中间人)
- 7 Introduce Foreign Method (引入外加函数)
- 8 Introduce Local Extension (引入本地扩展)
1 Move Method (搬移函数)
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或者被后者调用。
在该函数最常引用的类中建立一个有着类似行为新函数。将旧函数变成一个委托函数,或者将旧函数完全移除。
动机
如果一个类有太多行为,或与另一个类高度耦合,搬移函数,使类更简单。
做法
迁移过程中考虑多态的情况和访问权限的问题,若果迁移方法被引用过多,将旧函数变成委托函数,否则将其完全移除。
2 Move Field (搬移字段)
你的程序中,某个字段被其所驻类之外的另一个类更多地用到。
在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。
动机
按需
做法
- 如果被搬移字段是public的, 先使用Encapsulate Field将它封装起来.
- 检查是否有现成的字段或函数可以获取搬移目标对象,如果没有,建立一个这样的函数。如果还不行,在源类中建立一个目标类的引用。
- 如果源字段不是private的,必须在源类的所有子类中查找替换
3 Extract Class (提炼类)
某各类做了应该由两个类做的事。
建立一个新类,将相关的字段和函数从旧类搬移到新类。
动机
后期开发中类的子类化如果只影响类的一部分特性,原来的类需要分解。
做法
- 分解责任,合理命名新类
- 建立两类连接,搬移,精简接口
4 Inline Class (将类内联化)
某个类没有做太多事情。
将这个类的所有特性搬移到另一个类中,然后移除源类。
做法
如果目标类访问权限只在源类内部,如private嵌套类,可放心内联。如果目标类访问权限过大,可先修改类名,让编译器替我们检查目标类被引用的地方。
5 Hide Delegate (隐藏“委托关系”)
客户通过一个委托类来调用另一个对象。 在服务类上建立客户所需求的所有函数,用以隐藏委托关系。
动机
封装。
在委托关系过少的情况下可以使用此手法,如果委托关系过多,使用移除中间人。
做法
建立委托函数,调整客户调用之
6 Remove Middle Man (移除中间人)
某个类做了过多的简单委托动作。
让客户直接调用受托类。
动机
与5相反,尺度问题。
7 Introduce Foreign Method (引入外加函数)
你需要为提供服务的类增加一个函数,但你无法修改这个类。
在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。
动机
- 如果以外加函数实现一项功能,这个函数本应在服务类中出现
- 如果你发现为一个类添加了大量外加函数,或者发现有许多类都需要同样的外加函数,则应该使用引入本地扩展。
做法
- 这个函数不应该调用客户类的任何特性,如果它需要一个值,把该值当作参数来传递给它
- 可将函数注释为外加函数,以便将来有机会将其搬移到服务类中
8 Introduce Local Extension (引入本地扩展)
你需要为服务类提供一些额外函数,但你无法修改这个类。
建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。
动机
- 将引入外加函数生成的过多函数组织到一起,便于管理
- 引入本地扩展有两种方式,子类或包装类
- 使用子类打破封装性,但是可以直接增加新功能。
- 使用包装类不会存在打破封装的行为,但是需要为原始类的所有函数提供委托函数。
- 建议原始类中函数过多使用子类扩展, 否则使用包装类
做法
新建类,创建转型构造函数,加入新特性,替换