高内聚低耦合:让模块"团结而独立"
· · ·
"好的设计:内部紧密合作,外部松散连接。"
题目进度 0 / 0 ✓ 0
**预计时间:**15 分钟读 + 15 分钟做习题 = 30 分钟。
本课承诺
读完这节课,你将掌握:
① 内聚 (Cohesion) 和耦合 (Coupling) 的精确定义;② 高内聚低耦合的 2 步框架;③ 如何识别"坏设计"。
① 内聚 (Cohesion) 和耦合 (Coupling) 的精确定义;② 高内聚低耦合的 2 步框架;③ 如何识别"坏设计"。
一、什么是内聚和耦合
内聚:模块内部元素之间的关联程度
高内聚:模块内部元素紧密相关,都服务于同一个目标
低内聚:模块内部元素松散关联,各做各的
耦合:模块之间的依赖程度
低耦合:模块之间依赖很少,可以独立修改
高耦合:模块之间依赖很多,改一个影响其他
芒格式翻译
"低内聚、高耦合" = 最笨的设计(混乱)。
"高内聚、低耦合" = 最聪明的设计(清晰)。
芒格说:"好的设计:内部紧密合作,外部松散连接。"
"高内聚、低耦合" = 最聪明的设计(清晰)。
芒格说:"好的设计:内部紧密合作,外部松散连接。"
二、内聚的层次
| 层次 | 描述 | 好坏 |
|---|---|---|
| 巧合内聚 | 元素放在一起只是巧合 | 最差 |
| 逻辑内聚 | 元素处理同一类逻辑 | 较差 |
| 时间内聚 | 元素在同一时间执行 | 一般 |
| 过程内聚 | 元素遵循同一过程 | 较好 |
| 功能内聚 | 元素完成同一功能 | 最好 |
内聚的陷阱
不是所有事都需要用高内聚!
1. 过度内聚:模块太大,失去灵活性
2. 错误内聚:把不相关的元素放在一起
3. 忽视依赖:模块内部元素有依赖,但你没发现
平衡:内聚是"逻辑标准",不是"物理标准"。
1. 过度内聚:模块太大,失去灵活性
2. 错误内聚:把不相关的元素放在一起
3. 忽视依赖:模块内部元素有依赖,但你没发现
平衡:内聚是"逻辑标准",不是"物理标准"。
三、耦合的层次
| 层次 | 描述 | 好坏 |
|---|---|---|
| 内容耦合 | 一个模块直接访问另一个的内部 | 最差 |
| 公共耦合 | 模块共享全局数据 | 较差 |
| 外部耦合 | 模块共享外部格式/协议 | 一般 |
| 控制耦合 | 一个模块控制另一个的执行 | 较好 |
| 数据耦合 | 模块通过参数传递数据 | 最好 |
耦合的陷阱
不是所有事都需要用低耦合!
1. 过度解耦:模块之间没有连接,系统无法工作
2. 错误解耦:把必须连接的模块断开
3. 忽视依赖:模块之间有依赖,但你没发现
平衡:耦合是"逻辑标准",不是"物理标准"。
1. 过度解耦:模块之间没有连接,系统无法工作
2. 错误解耦:把必须连接的模块断开
3. 忽视依赖:模块之间有依赖,但你没发现
平衡:耦合是"逻辑标准",不是"物理标准"。
四、2 步框架:实现高内聚低耦合
第 1 步:检查内聚
先检查模块内部元素是否紧密相关。
案例:电商系统
模块:OrderModule
内部元素:创建订单 / 取消订单 / 查询订单
检查:3 个元素都服务于"订单管理"这个目标
结论:高内聚。
内部元素:创建订单 / 取消订单 / 查询订单
检查:3 个元素都服务于"订单管理"这个目标
结论:高内聚。
案例:电商系统(反例)
模块:OrderModule
内部元素:创建订单 / 发送邮件 / 生成报表
检查:3 个元素服务于不同目标
结论:低内聚。
内部元素:创建订单 / 发送邮件 / 生成报表
检查:3 个元素服务于不同目标
结论:低内聚。
第 2 步:检查耦合
再检查模块之间是否有不必要的依赖。
案例:电商系统
模块:OrderModule / PaymentModule
连接:OrderModule 调用 PaymentModule 的 pay() 方法
检查:OrderModule 只依赖 PaymentModule 的接口
结论:低耦合。
连接:OrderModule 调用 PaymentModule 的 pay() 方法
检查:OrderModule 只依赖 PaymentModule 的接口
结论:低耦合。
案例:电商系统(反例)
模块:OrderModule / PaymentModule
连接:OrderModule 直接访问 PaymentModule 的数据库
检查:OrderModule 依赖 PaymentModule 的内部实现
结论:高耦合。
连接:OrderModule 直接访问 PaymentModule 的数据库
检查:OrderModule 依赖 PaymentModule 的内部实现
结论:高耦合。
五、高内聚低耦合的好处
好处 1:可维护性
修改一个模块,不影响其他模块
好处 2:可测试性
每个模块可以独立测试
好处 3:可复用性
一个模块可以在多个地方复用
芒格式翻译
"低内聚、高耦合" = 最笨的设计(混乱)。
"高内聚、低耦合" = 最聪明的设计(清晰)。
芒格说:"好的设计:内部紧密合作,外部松散连接。"
"高内聚、低耦合" = 最聪明的设计(清晰)。
芒格说:"好的设计:内部紧密合作,外部松散连接。"
六、练习题
单选题
1
内聚是指?
2
耦合是指?
3
"好的设计:内部紧密合作,外部松散连接"体现了?
4
"创建订单/取消订单/查询订单"属于?
5
"创建订单/发送邮件/生成报表"属于?
6
实现高内聚低耦合的第一步是?
7
"模块只依赖接口,不依赖实现"属于?
8
高内聚低耦合的好处不包括?
9
"修改一个模块,不影响其他模块"属于?
10
高内聚低耦合是"逻辑标准"还是"物理标准"?
案例分析
C1
C1. 案例:团队要做电商系统,用高内聚低耦合,应该先做什么?
C2
C2. 案例:团队要做社交系统,用高内聚低耦合,应该先做什么?
C3
C3. 案例:团队要做工具系统,用高内聚低耦合,应该先做什么?
反事实思考题
T1
T1. 反事实:如果团队没有用高内聚低耦合,低内聚高耦合,最可能的结果是?
T2
T2. 反事实:如果团队过度解耦,模块之间没有连接,最可能的结果是?
下一步:Lesson 0011 · 抽象与封装——如何让系统”隐藏复杂性,暴露简单性”。