迪米特原则(LoD)

  1. 概念
    迪米特法则–最少知识原则,简单点来说就是一个对象应该对 其他对象尽可能少的了解
    迪米特法则有很多种表述方式
    1)只与你直接的朋友通信
    2)不要跟陌生人说话
    3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
  2. 狭义的迪米特法则
    如果两个类不需要直接通信,那么这两个类就不应当发生直接的相互作用。但是如果需要调用方法,可以通过第三者转发这个调用。

Java与模式第十一章读书笔记
如上图,如果某人想知道陌生人的消息,但是这样却需要某人与陌生人直接发生相互作用。但是如果朋友与陌生人互相认识,就可以借助朋友去知道陌生人。如下图:Java与模式第十一章读书笔记
迪米特法则建议某人不要直接与陌生人发生相互作用,而是通过朋友与之发生关系,如下图:Java与模式第十一章读书笔记
这个时候朋友实际上起到了将某人和陌生人的调用转发给陌生人的作用,这种传递叫做调用转发(Call Forwarding)。即需要隐藏陌生人的存在,使得某人仅知道朋友,而不知道陌生人,换句话说就是某人会认为他所调用的方法是朋友的方法。
那么如何与某人成为朋友呢?
1)当前对象本身(this)
2)以参数形式传入到当前对象的方法中的对象
3)当前对象的实例变量直接饮用的对象。
4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也是朋友
5)当前对象所创建的对象
只要满足上述条件之一就算是当前对象的朋友,否则就是陌生人。
3. 狭义迪米特法则的缺点:
1)会在系统里造出大量的小方法,散落在系统的各个角落。这些方法仅仅是传递间接的调用,因此与系统的业务逻辑无关。虽然类之间遵循迪米特法则会使得局部和远距离对象不会直接相互作用,但是同时也会造成系统的不同模块之间的通信效率降低,使得不同模块之间不容易协调。
2)解决上述问题的方法之一就是可以使用依赖倒转原则,引入一个抽象的类型引用“抽象陌生人”,使得莫柔依赖于抽象陌生人,就是把抽象陌生人变成朋友。如下图:
Java与模式第十一章读书笔记
这样就是某人与陌生人建立的朋友关系,好处就是朋友可以随时替换陌生人,只要新的陌生人具有相同的抽象类型。Java与模式第十一章读书笔记
4. 门面模式和调停者模式实际上就是迪米特法则的应用
5. 广义的迪米特法则
迪米特法则所谈论的就是对象之间的信息流量、流向以及信息的影响的控制。在软件系统中,一个模块设计的好不到最主要、最重要的标志就是该模块在多大的程度时将自己的内部数据和其他 与实现有关的细节隐藏起来。换言之就是彻底的将提供给外界的API和自己的实现分隔开来,这样模块与模块之间就可以仅仅通过批次的API互相通信,而不理会内部的工作细节。这就是“封装”。
这么做的好处就是可以使各个子系统直接解耦,从而允许他们独立的被开发、优化、使用、阅读和修改。一旦确认摸一个模块是性能障碍的,就要可以针对这么模块本身进行优化,不必担心影响到其他的模块。还可以促进软件的复用,由于每一个模块都不依赖于其他的模块,因此每一个模块都可以独立的在其他地方使用。
6. 迪米特法则注意事项:
1)在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。
2)一个处在弱耦合中的类- -旦被修改,不会对有关系的类造成波及。
3)在类的结构设计上,每一个类都应当尽量降低成员的访问权限( Accessibility)。换言之,一个类包装好各自的private 状态(自己的“秘密”)。这样一-来,想要了解其中的一个类的意义时,不需要了解很多别的类的细节。
4)一个类不应当public自己的属性,而应当提供取值和赋值方法让外界间接访问自己的属性。在类的设计.上,只要有可能,一个类应当设计成不变类。
5)在对其他类的引用,上,一个对象对其对象的引用应当降到最低
7. 广义迪米特法则在类设计上的体现
1)优先考虑讲一个类设置成不变类。
2)降低一个类的访问权限
3)谨慎使用Serializable
4)尽量降低成员的访问权限
8. 有关迪米特法则的俗语
1)你走你的阳关道,我走我的独木桥
2)井水不犯河水
3)城门失火殃及池鱼
4)四海之内皆兄弟
大家可以思考一下,哪些是符合迪米特原则,哪些是不合符的?

相关文章: