Skip to content

迪米特法则

定义

迪米特法则(Law of Demeter, LoD) 由美国东北大学的Ian Holland于1987年提出,其核心定义为:

“一个对象应该对其他对象有最少的了解。”

具体而言,任何对象只应与以下角色直接交互:

  • 自身成员(属性、方法);
  • 方法参数传入的对象;
  • 自身创建的对象;
  • 当前对象的直接组件或依赖(如聚合关系中的成员)。

简而言之,不要和“陌生对象”对话,避免通过链式调用深入其他对象的内部结构(如 user.getWallet().getBalance())。

实际应用价值

  • 减少依赖传播:限制模块间的直接依赖,避免修改波及多个层级。
  • 增强封装性:隐藏对象内部结构,仅暴露必要的协作接口。
  • 简化单元测试:依赖对象可通过 Mock 替代,无需构造复杂链式对象。

适用场景:

  • 模块化架构设计(如微服务间的 API 调用);
  • 分层系统(如 MVC 中 Controller 不直接操作数据库连接);
  • 复杂对象网络的管理(如 GUI 组件的事件委托)。

注意事项

  • 避免教条主义:在简单场景(如 DTO 数据传递)中,适度链式调用可接受。
  • 平衡设计成本:过度封装可能导致冗余中间方法(如 A.getB().getC() 改为 A.getC())。
  • 结合设计模式:外观模式(Facade)和中介者模式(Mediator)是实践 LoD 的典型工具。

总结

迪米特法则的本质是通过约束对象间的通信路径,构建高内聚、低耦合的系统,而非机械地限制方法调用层级。合理运用此原则,可显著提升代码的健壮性和可维护性。