重构之在对象之间搬移特性

来源:互联网 发布:java制作骰子 编辑:程序博客网 时间:2024/05/30 22:58
在对象的设计过程中,"决定把责任放在哪"即使不是最重要的事,也是最重要的事之一。类往往会因为承担过多责任而变得臃肿不堪,这种情况下,我会使用提炼类将一部分责任分离出去。如果一个类变得太"不负责任",我就会使用内联类将它融入另一个类。如果一个类使用了另一个类,运用隐藏委托关系将这种关系隐藏起来通常是有帮助的。有时会隐藏委托类会导致拥有者的接口经常变化,此时需要使用移除中间人。
一.搬移函数
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者或者被后者调用。在该函数最常引用的类中简历一个有着类似行为的新函数。将旧函数编程一个单独的委托函数,或是将旧函数完全移除。
搬移函数是重构理论的支柱。如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落地实现系统任务。
我常常会浏览类的所有函数,从中找出这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多。一旦我移动了一些字段,就该做这样的检查。一旦发现有可能搬移的函数,就会观察调用它的那一端,它调用的那一端,一级继承体系中它的任何一个重定义函数。然后,会根据这个函数与哪个对象的交流比较多,决定其移动路径。
二.搬移字段
在你的程序中,某个字段被其所驻类之外的另一个类更多地用到。在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段。
在类之间移动状态和行为,是重构过程中必不可少的措施。随着系统的发展,你会发现自己需要新的类,并需要将现有的工作责任拖到新的类中。在这个星期看似合理的设计决策,到了下个星期可能不再正确。如果我发现,对于一个字段,在其所驻类之外的另一个类中有更多函数使用了它,我就会考虑搬移这个字段。上述所谓的使用可能是通过getter,setter函数间接进行的。我也可能移动改字段的用户(某个函数),这取决于是否需要保持接口不受变化。如果这些函数看起来很适合待在原地,我就选择搬移字段。
三.提炼类
某个类做了应该由两个类做的事。建立一个新类,将相关的字段和函数从旧类搬移到新类。
你也许听过类似这样的教诲,一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个独立的类,于是随着责任的增加,这个类会变得过分复杂。很快你的类就会变成一团乱麻。
这样的类往往含有大量函数和数据,这样的类往往太大不易理解。此时你需要考虑哪些部分可以分离出去,并将它们分离到一个单独的类中。如果某些数据和某些函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去。另一个往往在开发后期出现的信号是类的子类化方式。如果你发现子类化只影响类的部分特性,或如果你发现某些特性需要以一种方式来子类化,某些特性则需要另一种方式子类化,这就意味你需要分解原来的类。
四.将类内联化
某个类没有做太多事情,将这个类的所有特性搬移到另一个类中,然后移除原类。
内联类正好与提炼类相反。如果一个类不在承担足够责任,不再有单独存在的理由,我就会挑选这一萎缩类的最频繁用户,以内联类手法将萎缩类塞进另一个类中。提炼类和内联类是完全相反的两种重构手法,具体使用哪一种没有明显的界限,我们要根据实际的情况分析,判断一个类是否需要拆开,一个类是否需要存在。
五.隐藏委托关系
客户通过一个委托类来调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。
封装即使不是对象的最关键特征,也是最关键特征之一。封装意味着每个对象都应该尽可能少的了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少,这会使变化比较容易进行。
任何学过对象技术的人都知道:虽然Java允许将字段声明为public,但你还是应该隐藏对象的字段。随着经验日渐丰富,你会发现,有更多可以封装的东西。
如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。你可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么一来,即使将来发生委托关系上的变化,变化也将被限制在服务对象上,不会涉及客户。
六.移除中间人
某个类做了过多的简单委托动作,让客户直接调用受托类。
在隐藏委托关系一节中,我们谈到了封装受托对象的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用受托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受托类的特性越来越多,这一过程会让你痛苦不已。服务类完全变成了一个中间人,此时你应该让客户直接调用受托类。
很难说什么程度的隐藏才是合适的。还好有了隐藏委托关系和移除中间人,你可以在系统运行过程中不断进行调整。随着系统的变化,合适的隐藏程度这个尺度也相应变化。
原创粉丝点击