在对象之间迁移数据
7.1 Move Method (搬移函数)
如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,就需要搬移函数
在类中寻找这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多
7.2 Move Field (搬移字段)
对一个字段,在其所驻类之外的另一个类中有更多函数使用了它,我么就会考虑搬移这个字段
7.3 Extra Class (提炼类)
动机:
- 一个类应该是一个清楚的抽象,处理一些明确的责任,如果类中积累的责任和功能越来越多,就可以考虑将其拆分
- 如果子类化只影响类的部分特性,或者发现某些特性需要以一种方式来子类化,某些特性需要以另一种方式子类化,这就意味着需要分解原来的类
注意的点:
- 尽量是旧类使用新类的方法和特性,尽量避免双向依赖
- 先搬移低层函数(被其他函数调用多于调用其他函数)再搬移高层函数
- 搬移完成后决定是否公开新类
7.4 inline class (将类内联化)
某个类没有做太多事情,将这个类的所有特性搬移到另一个类中(必须是和这个类功能相同的类),然后移除原类
7.5 Hide Delegate (隐藏委托关系)
客户通过一个委托类来调用另一个对象,在服务类上建立客户所需的所有函数,用以隐藏委托关系
这样做的好处就是客户只需要了解服务端,而委托类对于客户类来说是隐藏的
宗旨:
尽可能减少一个类了解系统其他部分的可能性 (耦合度尽量低)
7.6 Remove Middle Man (移除中间人)
这一条和7.5的做法正好相反
如果在服务类上建立了太多的客户所需函数, 服务类就变成了一个中间人,此时就应该让客户直接调用委托类
7.6和7.5要如何选择:
书中认为是完全是凭经验,尺度不好把握,感觉不合适可以随时调整
7.7 Introduce Foreign Method (引入外加函数)
当你需要为提供服务的类增加一个函数,但你无法修改这个类,需要在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。
7.8 Introduce Local Extension (引入本地扩展)
本条是7.7的升级版,如果7.7的操作做的过多(两次以上),那么可以考虑子类化或者包装类的方式,这两种方案统称为本地扩展