高内聚与低耦合
高内聚指模块内部的元素围绕同一目的,低耦合指模块之间的依赖尽量少而稳定。两者通常同向变化:把职责按变化原因聚拢,跨模块依赖会自然减少;随意拆分会制造大量细碎依赖。工具上可以用扇入、扇出、不稳定度等指标观察,但最终判据仍是变更成本。
基本信息
| 内聚 | 模块内部元素是否围绕同一目的 |
|---|---|
| 耦合 | 模块之间依赖的数量与稳定性 |
| 常见指标 | 扇入、扇出、不稳定度、变更耦合 |
| 方向 | 核心模块宜稳定,边缘与适配层可以有更多依赖 |
| 最终判据 | 改一处需要动多少模块 |
典型使用场景
- 判断某个类是否该拆分或合并
- 评审时评估新引入的跨模块依赖方向
- 重构前先看清哪些模块总是一起被改
- 核心与边缘模块使用不同的稳定性要求
- 观察架构腐化趋势,而不是只看单次改动
结构改善方向
结构改善方向
// 高耦合:订单模块直接写库存表、发短信、跑报表
// 低耦合:订单依赖库存端口与通知端口,适配器各自实现
class OrderService {
OrderService(InventoryPort inventory, Notifier notifier) { ... }
}
// 依赖方向稳定后,替换实现不必改动业务逻辑常用观察指标
| 指标 | 含义 | 方向 |
|---|---|---|
| 扇入 fan-in | 被多少模块依赖 | 高说明是稳定核心 |
| 扇出 fan-out | 依赖了多少模块 | 高说明较脆弱 |
| 不稳定度 | 依赖数与承接数之比 | 核心宜低、边缘可高 |
| 变更耦合 | 经常一起改动的模块 | 高说明边界可疑 |
指标只用来提示可疑点:一个模块扇出很高,但每次改动只影响它自己,未必是问题;反过来,指标好看但改一处要动七八个模块,才是真正需要处理的对象。
不要一味把耦合压到零:必要的协作被拆散后业务流程会碎片化,调用方要在多个模块之间拼装,整体复杂度反而上升。