迪米特法则(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,但服务器未作调整,会出现序列化失败的错误。

最佳实践

核心观念:

类间解耦,弱耦合,提高类的复用率

劣势:

  • 产生大量的中转或跳转类

  • 提高了系统的复杂性

  • 增加维度难度

使用时需要反复权衡,既让结构清晰,又高内聚低耦合。


读《设计模式之禅》第五章 迪米特法则