【设计原则】面向对象设计原则之五:迪米特原则

2015年04月16日

注:本文来自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) 类之间没有多余的关系,更有利于重构维护;
 

五、示例