重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处: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:下一篇将介绍重构笔记——移除中间人)

重构笔记文章

重构笔记——入门篇

重构笔记——代码的坏味道(上

重构笔记——代码的坏味道(下)

重构笔记——构筑测试体

重构笔记——提炼函数

重构笔记——内联函数

重构笔记——内联临时变量

重构笔记——以查询取代临时变量

重构笔记——引入解释性变量

重构笔记——分解临时变量

重构笔记——移除对参数的赋值

重构笔记——以函数对象取代函数

重构笔记——替换算法

重构笔记——搬移函数

重构笔记——搬移字段

重构笔记——提炼类

重构笔记——将类内联化

重构笔记——隐藏"委托关系"

时间: 2024-10-08 01:32:01

重构笔记——隐藏“委托关系”的相关文章

重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)

客户通过一个委托类来调用另一个对象.在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机:封装即使不是对象的最关机特性,也是最关机特性之一.“封装”意味着每个对象都应该少了解系统的其他部分.如此以来,一旦发生变化,需要了解这一变化的就比较少---这会使系统比较容易进行. 任何学过对象技术的人都知道:虽然Java将字段声明为public,但你还是应该隐藏对象的字段.随着经验日渐丰富,你会发现,有更多可以(值得)封装的东西.如果某个客户需要通过服务对象的字段得到另一个对象,然后调用后者的函数,

在对象之间搬移特性---Hide Delegate(隐藏委托关系)

客户通过一个委托类来调用另一个对象. 在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机: 封装即使不是对象的最关机特性,也是最关机特性之一."封装"意味着每个对象都应该少了解系统的其他部分.如此以来,一旦发生变化,需要了解这一变化的就比较少---这会使系统比较容易进行. 任何学过对象技术的人都知道:虽然Java将字段声明为public,但你还是应该隐藏对象的字段.随着经验日渐丰富,你会发现,有更多可以(值得)封装的东西. 如果某个客户需要通过服务对象的字段得到另一个对象,然后

重构笔记——将类内联化

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43159817         在上一篇文章中介绍了"提炼类".本文将介绍"将类内联化"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类并没有做太多的事情. 解决:将这个类的所有特性搬移到另一个类中,然后移除原类. 动机 "将类内联化"正好与"

重构笔记——引入本地扩展

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/44958839         在上一篇文章中介绍了"引入外加函数".本文将介绍"引入本地扩展"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你需要为服务类提供一些额外函数,但你无法修改这个类. 解决:建立一个新类,使它包含这些额外函数.让这个扩展品成为源类的子类或者包装类.

重构笔记——搬移函数

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42679983         我们都知道,类往往因为承担过多的责任而变得臃肿不堪.这种情况下,一般会使用"提炼类"这种手法将一部分责任分离出去.如果一个类变得"不负责任",一般会使用"内联类"这种手法将它融入另一个类.如果一个类使用了另一个类,一般会运用"隐藏委托关系"手法将这种关系隐藏

重构笔记——提炼类

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43059759         在上一篇文章中介绍了"搬移字段".本文将介绍"提炼类"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类做了应该由两个类做的事. 解决:建立一个新类,将相关的字段和函数从旧类搬移到新类. 动机 我们或多或少听过这样的教诲:一个类应该是一个清楚的

重构笔记——内联函数

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42261333         在上一篇文章中介绍了"提炼函数".本文将介绍"内联函数"这种重构手法.         下面让我们一起来学习该重构手法把. 开门见山         发现:一个函数的本体与名称同样清楚易懂. 解决:在函数调用点插入函数本体,然后移除该函数. //重构前 public int getRati

重构笔记——搬移字段

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42780243         在上一篇文章中介绍了"搬移函数".本文将介绍"搬移字段"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:程序中某个字段被其所驻类之外的另一个类更多地用到. 解决:在目标类新建一个字段,修改原字段的所有用户,令它们改用新字段. 动机 在类之间移动状态

重构笔记——分解临时变量

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42463871         在上一篇文章中介绍了"重构笔记--引入解释性变量".本文将介绍"分解临时变量"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果. 解决:针对每次赋值,创造一个独立.对应的