代码改变世界

什么是Law of Demeter

2004-08-15 14:22 FantasySoft 阅读(...) 评论(...) 编辑 收藏

        今天一如昨日,继续对WebWork进行小打小闹式的研究。在听了Raimundo老大一番醍醐罐顶般的讲解之后,我觉得要理解WebWork(XWork)巧妙的设计,还是得从IoC看起。于是,我开始阅读WebWork官方文档中关于IoC的部分。
        在阅读的过程中,我发现了一个有趣的短语:Law of Demeter。文档对IoC的优势的描述,有这样一条:
        Adheres to Law of Demeter. Some people think this is silly, but in practise I've found it works much better. Each class is coupled to only what it actually uses (and it should never use too much) and no more. This encourages smaller responsibility specific classes which leads to cleaner design.
        意思很好懂,倒是Law of Demeter是一张新面孔。将这张新面孔Google了一把,才发现它原来是一个非常有名的OO系统设计原则,而且跟现在的热门话题AOP还颇有联系。自己真的好孤陋寡闻啊!
        Law of Demeter主要表述的是这样一个原则:一个unit(通常是一个类中的方法)只能拥有尽可能少的其他unit的信息。而另外的一个总结则是:一个方法只能拥有尽可能少有关对象模型的信息。根据如上的总结,在AOP中,将类的方法提取出来,并归纳成一个个Aspect,作为Aspect本身,对于对象模型的信息的了解就得到有效的减少了。否则的话,像日志或者权限控制功能通常都会散布各个类之中,那么对象模型的信息对于方法而言就显露无遗了。
        对于Law of Demeter更为正式的表述如下:对于对象 'O' 中一个方法'M',M应该只能够访问以下对象中的方法:
        1、对象O;
        2、与O直接相关的Component Object;
        3、由方法M创建或者实例化的对象;
        4、作为方法M的参数的对象。

        由于对Law of Demeter还是知之甚少,就不多说了。有兴趣的朋友,可以参考下面的资料。

    [1] Law of Demeter的发源地;
    [2] 一篇很不错的讲述Law of Demeter的文章