重构笔记——隐藏“委托关系”
来源:互联网 发布:数据建模 开源 编辑:程序博客网 时间:2024/06/04 21:16
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929
在上一篇文章中介绍了“将类内联化”。本文将介绍“隐藏委托关系”这种重构手法。
下面让我们来学习这种重构手法吧。
开门见山
发现:客户通过一个委托关系来调用另一个对象。
解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系。
动机
我们都知道,”封装“即使不是对象的最为关键的特征,也是最为关键的特征之一。 ”封装“意味着每个对象都应该尽可能少了解系统的其它部分。这样,一旦发生变化,需要了解这一变化的对象就会比较少——这会使变化比较容易。
如果某个客户先通过服务对象的字段得到了另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生了变化,那么客户也得相应改变。那么,我们可以再服务器对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这样,即使在将来委托关系发生变化,也只在服务器对象中,而不会涉及客户。
做法
(1)对于每一个委托关系中的函数,在服务器端建立一个简单的委托函数。
(2)调整客户,令它只调用服务器对象提供的函数。(如果使用者和服务提供者不在同一个包,考虑修改委托函数的访问权限,让客户能够在包外调用)
(3)每次调整后,编译并测试。
(4)如果将来不再有任何客户需要使用委托类,便可移除服务对象中相关的访问函数。
(5)编译,测试。
示例
本例从两个类开始:代表“人”的person类和代表“部门”的department:
class Person{Department _department;public Department get_department() {return _department;}public void set_department(Department _department) {this._department = _department;}}
class Department{private String _changeCode;private Person _manager;public Person get_manager() {return _manager;}public void set_manager(Person _manager) {this._manager = _manager;}//......}如果客户想要知道某人的经理是谁,他必须先取得Department对象:
Person john = new Person();Person manager = john.get_department().get_manager();这样的编码对客户暴露了Department的工作原理,于是客户知道;Department用以追踪“经理”这条信息。如果对客户隐藏Department,可以减少耦合。为了到达预期的目的,在Person中建立一个简单的委托函数:
public Person getManager(){return _department.get_manager();}现在,需要修改Person的所有用户,让它们使用新的函数:
Person manager = john.getManager();只要完成了对Department所有函数的委托关系,并相应修改了Person的所有客户,就可以移除Person中的访问函数get_department()了。
本文主要介绍了重构手法——隐藏“委托关系”。该手法看起来的确挺简单,主要目的是减少代码中的耦合,对该手法的运用也需依具体情况,下一篇文章介绍的“移除中间人”就正好和该手法相反,所以灵活的运用还是挺重要的。现在我也还处于初级水平,期待慢慢的进步。
最后,希望本文对你有所帮助。有问题可以留言,谢谢。(PS:下一篇将介绍重构笔记——移除中间人)
重构笔记文章
重构笔记——入门篇
重构笔记——代码的坏味道(上)
重构笔记——代码的坏味道(下)
重构笔记——构筑测试体
重构笔记——提炼函数
重构笔记——内联函数
重构笔记——内联临时变量
重构笔记——以查询取代临时变量
重构笔记——引入解释性变量
重构笔记——分解临时变量
重构笔记——移除对参数的赋值 重构笔记——以函数对象取代函数
重构笔记——替换算法
重构笔记——搬移函数
重构笔记——搬移字段
重构笔记——提炼类
重构笔记——将类内联化
重构笔记——隐藏"委托关系"
1 0
- 重构笔记——隐藏“委托关系”
- Hide Delegate(隐藏委托关系)
- 7.5 hide delegate (隐藏委托关系)
- Hide Delegate(隐藏“委托关系”)
- 在对象之间搬移特性---Hide Delegate(隐藏委托关系)
- 重构笔记(二)——重构方法
- 重构笔记——入门篇
- 重构笔记——提炼函数
- 重构笔记——内联函数
- 重构笔记——替换算法
- 重构笔记——搬移函数
- 重构笔记——搬移字段
- 重构笔记——提炼类
- 重构笔记——入门篇
- C#学习笔记——委托
- 黑马程序员笔记——委托
- 黑马程序员——委托笔记
- 笔记——C#委托的理解
- 蓝桥杯 历届试题 分糖果 模拟
- 黑马程序员——集合框架1:体系框架
- Ubuntu14.10 编译 Android5.0 源码
- HDU 1003 Max Sum
- HDOJ 2025
- 重构笔记——隐藏“委托关系”
- Yii AR对象model查询
- 借前辈们的语录自勉,继续向前!
- CSS+DIV——前端er必备基础
- hdu 1072 Nightmare BFS,第一次刷BFS的题,感好牛逼的。。。
- php字符串处理
- [每天一个知识点]29-C语言-printf的格式符*
- win7激活概述
- jQuery选择器代码详解(三)——tokenize方法