美文网首页
[15] Message Chains (过度耦合的消息链)

[15] Message Chains (过度耦合的消息链)

作者: rxdxxxx | 来源:发表于2016-01-10 09:50 被阅读324次

    如果你看到用户向一个对象请求另一个对象, 然后再向后者请求另一个对象, 然后再请求另一个对象.......... 这就是消息链条.

    实际代码中你看到的可能是一长串getThis()或一长串临时变量. 采取这种方式, 意味着客户代码将与查询工程中的导航结构紧密耦合. 一旦对象间的关系发生了任何变化, 客户端就不得不做出相应修改.

    这时候你应该使用 Hide Delegate(隐藏委托关系). 你可以在消息链的不同位置进行这种重构手法. 理论上可以重构消息链条上的任何一个对象, 但是这么做往往会把一系列对象都变成Middle Man. 通常更好的选择是: 先观察消息链条最终得到的对象是用来干什么的, 看看能否以Extract Method(提炼方法) 把使用改对象的代码提炼到一个独立的函数中, 在运用Move Method(移动方法) 把这个函数推入消息链条. 如果这条链上的某个对象有多位客户打算航行此航线的剩余部分, 就加一个函数来做这件事.

    有些人把任何消息链都视为坏东西, 我们不这样想. 记住:

    具体问题具体分析
    

    Tips:

    Hide Delegate(隐藏委托关系)

    class Person {
        Department _department;
    
        public Department getDepartment(){
            return _department;
        }
    
        public void setDepartment (Department arg){
            _department = arg;
        }
        
    }
    
    class Department{
        private String _chargeCode;
        private Person _manager;
    
        public Department (Person manager){
            _manager = manager;
        }
    
        public Person getManager{
            return _manager;
        }
    
    }
    

    如果客户希望知道某人的经历是谁, 他必须先获得Department对象:

     manager = john.getDepartment().getManager();
    

    这样的编码就对客户端揭露了Department的工作原理, 于是客户知道:Department用以追踪"经理" 这条信息. 如果对客户端隐藏Department, 可以减少耦合. 为了这一目的, 我在Person中建立一个简单的委托函数:

    public Person getManager(){
        return _department.getManager();
    }
    

    现在,我需要修改Person的所有客户, 让它们改用新函数:

    manager = john.getManager();
    

    只要完成了对Department所有函数的委托关系, 并相应修改了Person的所有客户, 我就可以移除Person中的访问函数getDepartment()函数了

    相关文章

      网友评论

          本文标题:[15] Message Chains (过度耦合的消息链)

          本文链接:https://www.haomeiwen.com/subject/qrjqkttx.html