Appearance
迪米特法则
定义
迪米特法则(Law of Demeter, LoD) 由美国东北大学的Ian Holland于1987年提出,其核心定义为:
“一个对象应该对其他对象有最少的了解。”
具体而言,任何对象只应与以下角色直接交互:
- 自身成员(属性、方法);
- 方法参数传入的对象;
- 自身创建的对象;
- 当前对象的直接组件或依赖(如聚合关系中的成员)。
简而言之,不要和“陌生对象”对话,避免通过链式调用深入其他对象的内部结构(如 user.getWallet().getBalance())。
实际应用价值
- 减少依赖传播:限制模块间的直接依赖,避免修改波及多个层级。
- 增强封装性:隐藏对象内部结构,仅暴露必要的协作接口。
- 简化单元测试:依赖对象可通过 Mock 替代,无需构造复杂链式对象。
适用场景:
- 模块化架构设计(如微服务间的 API 调用);
- 分层系统(如 MVC 中 Controller 不直接操作数据库连接);
- 复杂对象网络的管理(如 GUI 组件的事件委托)。
注意事项
- 避免教条主义:在简单场景(如 DTO 数据传递)中,适度链式调用可接受。
- 平衡设计成本:过度封装可能导致冗余中间方法(如 A.getB().getC() 改为 A.getC())。
- 结合设计模式:外观模式(Facade)和中介者模式(Mediator)是实践 LoD 的典型工具。
总结
迪米特法则的本质是通过约束对象间的通信路径,构建高内聚、低耦合的系统,而非机械地限制方法调用层级。合理运用此原则,可显著提升代码的健壮性和可维护性。