耦合是什么
耦合衡量模块之间依赖的强度,从数据耦合、标记耦合、控制耦合、公共耦合到内容耦合依次增强。架构设计追求低耦合,但必须与内聚一起权衡:把功能拆得过细,模块之间的调用次数与数据传递反而变多,整体耦合可能不降反升。
怎么判断强不强
看变更的影响半径,而不是数接口个数。可以问一句:改这边是否总要在那边同步改?如果答案是经常,那么两个模块事实上属于同一个变更单元,边界画错了。另一个信号是参数形态:如果调用方需要构造对方的内部结构体才能调用,耦合已经不轻。
常见类型
| 类型 | 含义 | 风险 |
|---|---|---|
| 数据耦合 | 只传递简单数据 | 影响面小,最理想 |
| 标记耦合 | 传递复合结构如整行记录 | 字段变更波及双方 |
| 控制耦合 | 传递开关决定被调方行为 | 语义分散在调用方 |
| 公共耦合 | 共享全局可变状态 | 修改影响不可预测 |
| 内容耦合 | 直接访问对方内部实现 | 最高风险,改动无边界 |
降耦手段
- 传简单数据,避免传整行记录或对方的内部结构体
- 用返回值传递结果,不用输出参数与全局状态
- 依赖接口而非具体类型,把实现选择推迟到运行期
- 把同步调用改成事件通知,但要注意消费者回查成本
- 按变更频率重组模块,把总是一起改的部分放在一起
- 避免共享可变全局状态,用显式参数传递上下文
耦合评判要结合变化频率:稳定部分之间的强耦合可以接受,易变部分之间的强耦合才是债务来源。先看哪部分会变,再决定要不要解耦。