当前位置: 首页 > news >正文

迪米特法则(LoD)

当然可以!这次我们来讲解迪米特法则(Law of Demeter, LoD),又叫最少知识原则(Least Knowledge Principle)
我将从 定义 → 为什么需要 → 优缺点 → Python 示例 → 逻辑结构图 全面拆解,助你真正理解。


🧠 什么是迪米特法则(LoD)?

迪米特法则:一个对象应尽可能少地了解其他对象的内部细节

换句话说:
“你只能和你直接的朋友说话,而不要和朋友的朋友说话。”


🎯 更通俗解释:

  • ❌ 不要这样:a.b.c.d.doSomething()
  • ✅ 应该这样:a.doSomething()

你不需要了解 b 是谁、c 是什么结构、d 有没有方法。


✅ 为什么需要 LoD?

好处说明
降低耦合度每个类只关心与它直接关联的对象
提高封装性对象对外暴露尽可能少的细节
代码更可维护当内部结构变了,不影响外部依赖
更易于重构接口更稳定、组件更独立

❌ 迪米特法则的缺点?

缺点说明
封装层数多为了避免链式访问,可能需要增加中转方法
代码“跳转多”每一层都写封装方法,会让代码看起来“冗长”
初期复杂度提升需要花精力设计 API 接口的合理暴露边界

🐍 Python 示例

❌ 违反迪米特法则

class Engine:def start(self):print("Engine started")class Car:def __init__(self):self.engine = Engine()class Driver:def drive(self, car: Car):car.engine.start()  # ❌ 直接访问 Car 的子对象 Engine

这里 Driver 不应该关心 Carengine,这是“朋友的朋友”。


✅ 遵守迪米特法则

class Engine:def start(self):print("Engine started")class Car:def __init__(self):self.engine = Engine()def start_engine(self):  # ✅ 对外暴露接口self.engine.start()class Driver:def drive(self, car: Car):car.start_engine()  # ✅ 只调用 Car 的公开方法
  • Driver 只与 Car 交互,而不需要知道 engine 的存在。
  • Carengine 进行封装,符合“最少知识”。

🧭 逻辑图(Mermaid)

调用 start_engine()
内部调用 start()
Driver
+drive(car: Car)
Car
-engine: Engine
+start_engine()
Engine
+start()

🧩 应用场景(适用 vs 不适用)

✅ 推荐使用 LoD 的场景:

  • 多层嵌套结构(如 MVC、网络传输、领域模型)
  • 微服务调用时保护 API 边界
  • 大型系统中模块解耦设计

❌ 不推荐使用的场景:

  • 简单脚本、性能敏感代码(层层封装可能会带来性能瓶颈)
  • 极简数据访问(例如直接调用 data.id

🏁 总结一句话

迪米特法则=“最少知道” + “别越界”
只操作你直接信任的对象,不要过度了解或依赖别人的内部实现,否则系统就变得脆弱。


如果你希望,我可以再画一张**“违反 vs 遵守”的对比图**,或者做个“真实场景案例”比如 Web Controller 层应用 LoD 的封装模式。

想继续深入哪部分?图示对比、还是实战代码?✨

相关文章:

  • Baklib内容中台落地实战指南
  • 传奇各职业/战士/法师/道士/手套/手镯/护腕/神秘腰带爆率及出处产出地/圣战/法神/天尊/祈祷/虹魔/魔血
  • 用c 编写的笔记搜索程序
  • 如何用Python绘制两个圆之间的8条公切线
  • 第J6周:ResNeXt-50实战
  • C++ 动态内存管理详讲
  • 数字智慧方案5877丨智慧交通项目方案(122页PPT)(文末有下载方式)
  • SX24C01.UG-PXI程控电阻桥板卡
  • 英一真题阅读单词笔记 20-21年
  • 藏文词云生成器学习实践
  • 2000-2020年全国各地级市资本存量测算数据(以2000年为基期)(含原始数据+计算过程+结果)
  • 数字智慧方案5875丨智慧交通枢纽综合解决方案(43页PPT)(文末有下载方式)
  • ValueError: expected sequence of length 8 at dim 2 (got 0)
  • 历史数据分析——运输服务
  • B站Michale_ee——ESP32_IDF SDK——FreeRTOS_6 任务通知同步、任务通知值
  • Qt QGraphicsScene 的用法
  • 分享国产AI工作流集成数据库完成业务处理
  • 常见工业汽车行业通讯接口一览表
  • 珠江桥牌闪耀第137届广交会,展现中国味道与创新活力
  • 【Redis】Hash哈希
  • 做建网站的公司/站长网站大全
  • 网站诊断表/seo技术外包公司
  • 当今做网站的流行趋势/刘连康seo培训哪家强
  • 网站的建设费用预算策划书/seo服务 文库
  • 汉口做网站公司/网络销售怎么找客源
  • 一级域名的网站制作/cpm广告联盟平台