如果你发现某个类做了过多的简单委托动作,你就可以考虑是否可以让客户直接去调用受托类。在Hide Delegate中,我们介绍了封装受托对象的好处,但好处归好处也存在代价,就是当你每次需要在受托对象中增加新函数的时候你都需要在委托的服务对象中增加相应的函数来委托。随着受托对象特性越来越多,你会发现你所要处理的东西变得越来越复杂,你会感觉这个服务对象完全成为了一个中间人(Middle Man),此时你就应该考虑能否让客户直接去调用受托对象。

你不需要去考虑什么程度的封装才是合理,重构带给你Hide Delegate和Remove Middle Man的可能,你不需要去考虑这个问题,因为你不可能会考虑的很周到,需求是不断变化的,随着系统设计的更新,你的“合适的隐藏程度”也会发生相应的变化,昨天恰如其分的封装可能到了今天就变得臃肿不堪,重构的意义在于:你永远不必说对不起,只要把问题的地方修补好就行了

做法:

  • 在服务对象上建立一个新函数用于获得受托函数。
  • 对于每一个委托函数,在服务类中删除该函数,并让需要调用该函数的客户转而调用受托对象。
  • 处理每个委托函数之后都进行编译,测试。

例子:

class Person
{
public:
Person *manager() const
{
return m_department->manager();
}
private:
Department *m_department; }; class Department
{
public:
Department(Person *person) :
m_manager(person)
{
}
Person *manager() const
{
return m_manager;
}
private:
Person *m_manager;
};

在这里我们拿Hide Delegate的例子来解释,可以看到Person是Department的服务对象,Department是Person的受托类,当客户端代码

manager = john.manager();

要去获取的时候,都是通过Person进行间接获取。但如果大量函数都需要你这么做,你就必须在Person装安装大量的简单委托函数来处理这个问题。这就是应该移除中间人的时候了,首先在Person中建立一个函数用于获得受托对象。

class Person
{
public:
Department *deparment() const
{
return m_department;
}
};

然后逐一处理每个委托函数,针对这样的函数,我们要找到通过Person使用的函数,并对他们进行修改,让他首先获得受托对象然后直接使用后者。

manager = johon.department()->manager();

然后我就可以删除服务对象中的委托函数了,如果我遗漏了什么,编译器会告诉我。为了方便起见,可能会有情况会去保留部分委托关系,此外也有可能需要会对客户隐藏委托关系,让另外一些客户直接使用受托对象,基于这些原因,你也可以适当的保留一些简单的委托函数并把它们放在原地。

『重构--改善既有代码的设计』读书笔记----Remove Middle Man的更多相关文章

  1. 『重构--改善既有代码的设计』读书笔记----Remove Assignments to Parameters

    C++存在按值传递和按引用传递两种传递方式,Java严格按照按值传递这种方式来进行.以按值传递方式的角度来说,如果你 int test(int a) { ) { a = 1; } return a; ...

  2. 『重构--改善既有代码的设计』读书笔记----Extract Method

    在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...

  3. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...

  4. 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object

    有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...

  5. 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data

    当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...

  6. 『重构--改善既有代码的设计』读书笔记----Replace Array with Object

    如果你有一个数组,其中的元素各自代表不同东西,比如你有一个 QList<QString> strList; 其中strList[0]代表选手姓名,strList[1]代表选手家庭住址,很显 ...

  7. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

  8. 『重构--改善既有代码的设计』读书笔记----Move Method

    明确函数所在类的位置是很重要的.这样可以避免你的类与别的类有太多耦合.也会让你的类的内聚性变得更加牢固,让你的整个系统变得更加整洁.简单来说,如果在你的程序中,某个类的函数在使用的过程中,更多的是在和 ...

  9. 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object

    当你在一个类中使用字段的时候,发现这个字段必须要和其他数据或者行为一起使用才有意义.你就应该考虑把这个数据项改成对象.在开发初期,我们对于新类中的字段往往会采取简单的基本类型形式来保存,但随着我们开发 ...

随机推荐

  1. 单位分配的IP地址和电脑主机绑定了,我想用设置一个无线路由器,让我的笔记本电脑和手机都能上网?

    单位分配的IP地址和电脑主机绑定了,我想用设置一个无线路由器,让我的笔记本电脑和手机都能上网?     配一个无线路由器就可以实现,将电脑IP配置成自动获取,找条网线一头插路由LAN口(路由器上有标明 ...

  2. attitude

    刚看到一段挺有趣的游戏,分享一下. 如果 令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于 1 2 3 4 5 6 7 8 9 10 ...

  3. Matlab编程-基本命令行语句

    (1) mathlab命令行中“,”与“:”的区别: 结尾不加任何东西也会输出结果 以“,”结尾不显示变量数值,但是再次输入变量名之后可以输出变量值 以“:”结尾显示变量值 (2)    输出格式控制 ...

  4. 常用shell变量$#,$@,$0,$1,$2等

    常用shell变量$#,$@,$0,$1,$2的含义解释: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返 ...

  5. first blog编程之美-----计算1的个数

    根据以下总结写出以下程序,总结来源于网上 感想:得硬着头皮找规律 #include   int count1(int n) {         int i=1;         int count=0 ...

  6. conv2用法

    1.用法 C=conv2(A,B,shape);        %卷积滤波 A:输入图像,B:卷积核      假设输入图像A大小为ma x na,卷积核B大小为mb x nb,则      当sha ...

  7. [置顶] 提高生产力:开源Java工具包Jodd(Java的”瑞士军刀”)

    官方网站:http://jodd.org/ 下载地址:http://jodd.org/download/index.html Jodd=tools + ioc + mvc + db + aop + t ...

  8. Mysql重要配置参数的整理2

    http://ssydxa219.iteye.com/category/209848 下面开始优化下my.conf文件(这里的优化只是在mysql本身的优化,之前安装的时候也要有优化) cat /et ...

  9. etrace跟踪Nginx代码+ FASTCGI

    http://blog.csdn.net/jianqiangchen/article/details/29175285 http://blog.csdn.net/jianqiangchen/artic ...

  10. Cocos2d各版本搭建环境中的奇葩操作

    #Version: Cocos2d-x 3.4 Android 将[Cocos2d-x解压目录]\cocos\platform\android\java\src中的com,org目录拷贝覆盖到[项目根 ...