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

在对象的设计过程中,"决定把责任放在哪"即使不是最重要的事,也是最重要的事之一。类往往会因为承担过多责任而变得臃肿不堪,这种情况下,我会使用提炼类将一部分责任分离出去。如果一个类变得太"不负责任",我就会使用内联类将它融入另一个类。如果一个类使用了另一个类,运用隐藏委托关系将这种关系隐藏起来通常是有帮助的。有时会隐藏委托类会导致拥有者的接口经常变化,此时需要使用移除中间人。
一.搬移函数
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者或者被后者调用。在该函数最常引用的类中简历一个有着类似行为的新函数。将旧函数编程一个单独的委托函数,或是将旧函数完全移除。
搬移函数是重构理论的支柱。如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落地实现系统任务。
我常常会浏览类的所有函数,从中找出这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多。一旦我移动了一些字段,就该做这样的检查。一旦发现有可能搬移的函数,就会观察调用它的那一端,它调用的那一端,一级继承体系中它的任何一个重定义函数。然后,会根据这个函数与哪个对象的交流比较多,决定其移动路径。
二.搬移字段
在你的程序中,某个字段被其所驻类之外的另一个类更多地用到。在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段。
在类之间移动状态和行为,是重构过程中必不可少的措施。随着系统的发展,你会发现自己需要新的类,并需要将现有的工作责任拖到新的类中。在这个星期看似合理的设计决策,到了下个星期可能不再正确。如果我发现,对于一个字段,在其所驻类之外的另一个类中有更多函数使用了它,我就会考虑搬移这个字段。上述所谓的使用可能是通过getter,setter函数间接进行的。我也可能移动改字段的用户(某个函数),这取决于是否需要保持接口不受变化。如果这些函数看起来很适合待在原地,我就选择搬移字段。
三.提炼类
某个类做了应该由两个类做的事。建立一个新类,将相关的字段和函数从旧类搬移到新类。
你也许听过类似这样的教诲,一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个独立的类,于是随着责任的增加,这个类会变得过分复杂。很快你的类就会变成一团乱麻。
这样的类往往含有大量函数和数据,这样的类往往太大不易理解。此时你需要考虑哪些部分可以分离出去,并将它们分离到一个单独的类中。如果某些数据和某些函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去。另一个往往在开发后期出现的信号是类的子类化方式。如果你发现子类化只影响类的部分特性,或如果你发现某些特性需要以一种方式来子类化,某些特性则需要另一种方式子类化,这就意味你需要分解原来的类。
四.将类内联化
某个类没有做太多事情,将这个类的所有特性搬移到另一个类中,然后移除原类。
内联类正好与提炼类相反。如果一个类不在承担足够责任,不再有单独存在的理由,我就会挑选这一萎缩类的最频繁用户,以内联类手法将萎缩类塞进另一个类中。提炼类和内联类是完全相反的两种重构手法,具体使用哪一种没有明显的界限,我们要根据实际的情况分析,判断一个类是否需要拆开,一个类是否需要存在。
五.隐藏委托关系
客户通过一个委托类来调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。
封装即使不是对象的最关键特征,也是最关键特征之一。封装意味着每个对象都应该尽可能少的了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少,这会使变化比较容易进行。
任何学过对象技术的人都知道:虽然Java允许将字段声明为public,但你还是应该隐藏对象的字段。随着经验日渐丰富,你会发现,有更多可以封装的东西。
如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。你可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么一来,即使将来发生委托关系上的变化,变化也将被限制在服务对象上,不会涉及客户。
六.移除中间人
某个类做了过多的简单委托动作,让客户直接调用受托类。
在隐藏委托关系一节中,我们谈到了封装受托对象的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用受托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受托类的特性越来越多,这一过程会让你痛苦不已。服务类完全变成了一个中间人,此时你应该让客户直接调用受托类。
很难说什么程度的隐藏才是合适的。还好有了隐藏委托关系和移除中间人,你可以在系统运行过程中不断进行调整。随着系统的变化,合适的隐藏程度这个尺度也相应变化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值