在对象之间搬移特性
在对象设计过程中,决定把责任放在哪儿是即使不是最重要的事,也是最重要的事之一。常常只使用搬移函数和搬移字段简单地移动对象行为,就可以解决这些问题。如果这两个重构手法都需要用到,我会首先使用搬移字段,再使用搬移方法。如果一个类承担了太多责任而变得臃肿不堪,这种情况下会使用提炼类将一部分责任分离出去。如果一个类变得太不负责任,使用将类内联化将它融入到另一个类中。
搬移函数
你的程序中,有个函数与其所驻类之外的另个一类进行跟过的交流:调用后者或被后者调用。在该函数最长引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。如果一个类有太多行为,或如果一个类与另一个类有太多合作而高度耦合,就需要搬移函数。可以是系统中的类更简单
搬移字段
程序中,某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段,修改原字段的所有用户,令他们改用新字段
提炼类
某个类做了应该由两个类做的事。建立一个新类,将相关字段和函数从就类搬到新类。
将类内联化
某个类没有做太多的事情,不在承担足够责任,不再有的那单独存在的理由。将这个类的所有特性搬移到另一个类中,然后移除原类。
隐藏“委托关系”
客户通过一个委托类来调用另一个对象。在服务类上建立客户所需要的所有函数,用来隐藏委托关系。封装意味每个对象都应该少了解系统的其他部分。一旦发生变化,需要了解这一变化的对象就会比较少。如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数。那么客户就必须知晓这一层委托关系。万一委托关系变化,客户也要相应变化。
移除中间人
某个类做了过多的简单委托。让客户直接调用委托类。每当客户要使用手委托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受委托类的特性越来越多,这一过程会让你很痛苦。
引入外加函数
你需要为提供服务的类增加一个函数,但你无法修改这个类。在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。
如果可以修改源码,你可以自行添加一个新函数;如果不能,你就得在客户端编码,补足你要的那个函数
引入本地扩展
你需要为服务类踢狗一些额外函数,但你无法修改这个类。建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。