Learning
VOL. III · NO. 10 · Engineering · 01 JAN 1970

高内聚低耦合:让模块"团结而独立"

工程 · 01 JAN 1970 · 8 min read · 1,857 words
· · ·

"好的设计:内部紧密合作,外部松散连接。"

**预计时间:**15 分钟读 + 15 分钟做习题 = 30 分钟。

本课承诺
读完这节课,你将掌握:
内聚 (Cohesion) 和耦合 (Coupling) 的精确定义; 高内聚低耦合的 2 步框架; 如何识别"坏设计"。

一、什么是内聚和耦合

内聚:模块内部元素之间的关联程度

高内聚:模块内部元素紧密相关,都服务于同一个目标
低内聚:模块内部元素松散关联,各做各的

耦合:模块之间的依赖程度

低耦合:模块之间依赖很少,可以独立修改
高耦合:模块之间依赖很多,改一个影响其他

芒格式翻译
"低内聚、高耦合" = 最笨的设计(混乱)。
"高内聚、低耦合" = 最聪明的设计(清晰)。
芒格说:"好的设计:内部紧密合作,外部松散连接。"

二、内聚的层次

层次描述好坏
巧合内聚元素放在一起只是巧合最差
逻辑内聚元素处理同一类逻辑较差
时间内聚元素在同一时间执行一般
过程内聚元素遵循同一过程较好
功能内聚元素完成同一功能最好
内聚的陷阱
不是所有事都需要用高内聚!
1. 过度内聚:模块太大,失去灵活性
2. 错误内聚:把不相关的元素放在一起
3. 忽视依赖:模块内部元素有依赖,但你没发现
平衡:内聚是"逻辑标准",不是"物理标准"。

三、耦合的层次

层次描述好坏
内容耦合一个模块直接访问另一个的内部最差
公共耦合模块共享全局数据较差
外部耦合模块共享外部格式/协议一般
控制耦合一个模块控制另一个的执行较好
数据耦合模块通过参数传递数据最好
耦合的陷阱
不是所有事都需要用低耦合!
1. 过度解耦:模块之间没有连接,系统无法工作
2. 错误解耦:把必须连接的模块断开
3. 忽视依赖:模块之间有依赖,但你没发现
平衡:耦合是"逻辑标准",不是"物理标准"。

四、2 步框架:实现高内聚低耦合

第 1 步:检查内聚

先检查模块内部元素是否紧密相关。

案例:电商系统
模块:OrderModule
内部元素:创建订单 / 取消订单 / 查询订单

检查:3 个元素都服务于"订单管理"这个目标
结论:高内聚。
案例:电商系统(反例)
模块:OrderModule
内部元素:创建订单 / 发送邮件 / 生成报表

检查:3 个元素服务于不同目标
结论:低内聚。

第 2 步:检查耦合

再检查模块之间是否有不必要的依赖。

案例:电商系统
模块:OrderModule / PaymentModule
连接:OrderModule 调用 PaymentModule 的 pay() 方法

检查: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 · 抽象与封装——如何让系统”隐藏复杂性,暴露简单性”。