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

本文介绍了六种重构技巧,包括搬移函数、搬移字段、提炼类、将类内联化、隐藏委托关系和移除中间人,旨在帮助开发者简化类结构、减少耦合并提高代码的可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对象的设计过程中,"决定把责任放在哪"即使不是最重要的事,也是最重要的事之一。类往往会因为承担过多责任而变得臃肿不堪,这种情况下,我会使用提炼类将一部分责任分离出去。如果一个类变得太"不负责任",我就会使用内联类将它融入另一个类。如果一个类使用了另一个类,运用隐藏委托关系将这种关系隐藏起来通常是有帮助的。有时会隐藏委托类会导致拥有者的接口经常变化,此时需要使用移除中间人。
一.搬移函数
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者或者被后者调用。在该函数最常引用的类中简历一个有着类似行为的新函数。将旧函数编程一个单独的委托函数,或是将旧函数完全移除。
搬移函数是重构理论的支柱。如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落地实现系统任务。
我常常会浏览类的所有函数,从中找出这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多。一旦我移动了一些字段,就该做这样的检查。一旦发现有可能搬移的函数,就会观察调用它的那一端,它调用的那一端,一级继承体系中它的任何一个重定义函数。然后,会根据这个函数与哪个对象的交流比较多,决定其移动路径。
二.搬移字段
在你的程序中,某个字段被其所驻类之外的另一个类更多地用到。在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段。
在类之间移动状态和行为,是重构过程中必不可少的措施。随着系统的发展,你会发现自己需要新的类,并需要将现有的工作责任拖到新的类中。在这个星期看似合理的设计决策,到了下个星期可能不再正确。如果我发现,对于一个字段,在其所驻类之外的另一个类中有更多函数使用了它,我就会考虑搬移这个字段。上述所谓的使用可能是通过getter,setter函数间接进行的。我也可能移动改字段的用户(某个函数),这取决于是否需要保持接口不受变化。如果这些函数看起来很适合待在原地,我就选择搬移字段。
三.提炼类
某个类做了应该由两个类做的事。建立一个新类,将相关的字段和函数从旧类搬移到新类。
你也许听过类似这样的教诲,一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个独立的类,于是随着责任的增加,这个类会变得过分复杂。很快你的类就会变成一团乱麻。
这样的类往往含有大量函数和数据,这样的类往往太大不易理解。此时你需要考虑哪些部分可以分离出去,并将它们分离到一个单独的类中。如果某些数据和某些函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去。另一个往往在开发后期出现的信号是类的子类化方式。如果你发现子类化只影响类的部分特性,或如果你发现某些特性需要以一种方式来子类化,某些特性则需要另一种方式子类化,这就意味你需要分解原来的类。
四.将类内联化
某个类没有做太多事情,将这个类的所有特性搬移到另一个类中,然后移除原类。
内联类正好与提炼类相反。如果一个类不在承担足够责任,不再有单独存在的理由,我就会挑选这一萎缩类的最频繁用户,以内联类手法将萎缩类塞进另一个类中。提炼类和内联类是完全相反的两种重构手法,具体使用哪一种没有明显的界限,我们要根据实际的情况分析,判断一个类是否需要拆开,一个类是否需要存在。
五.隐藏委托关系
客户通过一个委托类来调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。
封装即使不是对象的最关键特征,也是最关键特征之一。封装意味着每个对象都应该尽可能少的了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少,这会使变化比较容易进行。
任何学过对象技术的人都知道:虽然Java允许将字段声明为public,但你还是应该隐藏对象的字段。随着经验日渐丰富,你会发现,有更多可以封装的东西。
如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。你可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么一来,即使将来发生委托关系上的变化,变化也将被限制在服务对象上,不会涉及客户。
六.移除中间人
某个类做了过多的简单委托动作,让客户直接调用受托类。
在隐藏委托关系一节中,我们谈到了封装受托对象的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用受托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受托类的特性越来越多,这一过程会让你痛苦不已。服务类完全变成了一个中间人,此时你应该让客户直接调用受托类。
很难说什么程度的隐藏才是合适的。还好有了隐藏委托关系和移除中间人,你可以在系统运行过程中不断进行调整。随着系统的变化,合适的隐藏程度这个尺度也相应变化。
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值