迪米特法则(LOD)也称为最少知识原则(LKP),虽然名字不同,但描述的是同一个规则:
- 一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少。
迪米特法则对类的低耦合提出了明确的要求,其包含以下4层含义:
- 只与直接的朋友通信。什么要做直接的朋友呢?每个对象者必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,例如:组合、聚合、依赖等。
- 朋友间也是有距离的,一个类公开的
public
属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。因此,为了保持朋友类之间的距离,在设计时需要反复衡量:是否还可以再减少public
方法和属性,是否可以修改为private
、package-private
(包类型,在类、方法、变量前不加访问权限,则默认为包类型)、protected
等访问权限,是否可以加上final
关键词等。
迪米特法则要求类尽量不要对外公布太多的
public
方法和非静态的public
变量,尽量内敛,多使用private
、package-private
、protected
等访问权限
- 是自己的就是自己的,如果一个方法放在本类中,既不增加类间的关系,也对本来不产生负面影响,那就放置在本类中。
- 谨慎使用
Serializable
迪米特法则的核心观念就是类间的解耦,弱耦合了以后,类的复用率才可以提高。其要求的结果就是产生了大量的中转或跳转类,导致系统的复杂性提高,同时也为维护带来难度。采用迪米特法则时需要反复权衡,既做到让结构清晰,又做到高内聚低耦合。