注:本文来自Nemo, http://nemotec.github.io
迪米特原则(LOD)
一、全称
"Law of Demeter" 迪米特原则
二、说明
迪米特法则又称为最少知识原则(Least Knowledge Principle, LKP),来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。
一个对象应该对其他对象了解最少。
迪米特法则的核心观念就是降低类与类之间的耦合。一个类对自己依赖的类知道的越少越好。对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。
三、实现
1. 类的设计
(1) 尽量降低类的访问权限
(2) 设计一个类应当尽量降低其成员变量和成员函数的访问权限
(3) 一个类如果可以尽量设计成不变类
(4) 一个对象对其他对象的引用应当降到最低
(5) 谨慎使用序列化功能
(6) 不要暴露类成员变量,而应该提供公有的访问方法
2. 对象只与直接朋友通信
迪米特法则还有一个更简单的定义:只与直接朋友通信。每个对象都会与其它对象发生联系,联系的紧密程度有很多种:
依赖
局部变量、方法参数、方法返回值或者对静态方法的调用
关联
成员变量
聚合
成员变量,整体与部分的关系, 且部分可以离开整体而单独存在
组合
成员变量,整体与部分的关系, 但部分不能离开整体而单独存在
只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。一个类与当前类联系紧密,在实现逻辑上有很强的关联性,那么可以认为它们是直接朋友。所以我们慎重考虑一个类与当前类的紧密程度,再决定它以怎么样的关系与当前类耦合,非直接朋友的类不要以局部变量的形式出现。
3. 引用第三方类来降低对象之间的耦合
我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。通过引入一个合理的第三方类来降低现有对象之间的耦合度。
四、优点
迪米特原则的核心原理是降低关联性,尽量减少类与类之间不必要的通信,通过第三方进行传达。
优点:
(1) 类与类之间的耦合度低,代码复用度高;
(2) 类之间没有多余的关系,更有利于重构维护;
五、示例