迪米特法则的来源:
迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern University的Ian Holland提出。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。于是就提出了迪米特法则。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。
迪米特法则的简单定义:
只与直接的朋友通信。
首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,当前对象本身(this)、成员变量、以参数形式传入当前对象方法中的对象、方法返回值中的类,当前对象创建的对象为直接的朋友。
迪米特法则的作用:
迪米特法则可降低系统的耦合度,使类与类之间保持较低的耦合关系。我们知道,软件编程有一个总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的。
迪米特法则的示例:
如图1所示,类之间存在复杂的交互关系,一个ClassBase类的动作执行将导致多个其它关联类产生响应,例如,当ClassBase有动作时时,和它有关联的类ClassB、ClassC、ClassD等都将发生改变,在初始设计方案中,对象之间的交互关系可简化为如图1所示结构:
在图1中,由于类之间的交互关系复杂,导致在该系统中增加新的对象时需要修改与之交互的其它类的源代码,系统扩展性较差,也不便于增加和删除新对象。
在本示例中,可以通过引入一个专门用于控制对象间交互的中介类(Mediator)来降低各对象之间的耦合度。引入中间类之后,相关对象之间不再发生直接引用,而是将请求先转发给中间类,再由中间类来完成对其它对象的调用。当需要增加或删除新的对象时,只需修改中间类即可,无须修改新增对象或已有对象的源代码,重构后结构如图2所示:
迪米特法则的使用总结:
(1).在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;
(2).在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;
(3).在类的设计上,只要有可能,一个类型应当设计成不变类;
(4).在对其他类的引用上,一个对象对其他对象的引用应当降到最低。