迪米特法则(Law of Demeter,LoD), 也称为最少只是原则(Least Knowledge Principle,LKP)
对类的低耦合提出了明确的要求
定义:
一个对象应该对其他对象有最少的了解
通俗
一个类应该对自己需要耦合或调用的类知道得越少越好。被耦合或调用的类的内部是如何复杂和类本身没什么关系。
包含四层含义
-
只和朋友交流
- Only talk to your immediate friends(只与直接的朋友通信。)
- 朋友类:出现在成员变量、方法的输入输出参数中的类成为成员朋友类
- 出现在方法体内部的类不属于朋友类
-
朋友间也是有距离的
- 描述朋友类之间的距离,不可太近(耦合关系过渡牢固导致修改变更的风险扩散)
- 一个类公开的public 属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大
- 是否还可以再减少public方法和属性
- 是否可以修改private、package-private、protected等访问权限
- 是否可以加上final关键字
- 等
- 尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多食用Aprivate、package-private、protected等访问权限
-
是自己的就是自己的
- 问题:如何衡量放在本类中还是其他勒种,前提是感觉都可放且无错误
- 原则:如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放在本类中
-
谨慎使用Serializable
- 在RMI(Remote Method Invocation,远程方法调用)中,传递的对象必须实现Serializable接口。如果客户端修改了属性的访问权限,将private改成public,但服务器未作调整,会出现序列化失败的错误。
最佳实践
核心观念:
类间解耦,弱耦合,提高类的复用率
劣势:
-
产生大量的中转或跳转类
-
提高了系统的复杂性
-
增加维度难度
使用时需要反复权衡,既让结构清晰,又高内聚低耦合。
读《设计模式之禅》第五章 迪米特法则