首页/开发/系统分析与架构设计速查/耦合(Coupling)与其类型
架构风格与模式58 条

耦合(Coupling)与其类型

耦合衡量模块间依赖强度,从数据耦合、标记耦合、控制耦合到公共耦合、内容耦合逐级增强;架构设计追求低耦合但需与内聚权衡。

耦合是什么

耦合衡量模块之间依赖的强度,从数据耦合、标记耦合、控制耦合、公共耦合到内容耦合依次增强。架构设计追求低耦合,但必须与内聚一起权衡:把功能拆得过细,模块之间的调用次数与数据传递反而变多,整体耦合可能不降反升。

怎么判断强不强

看变更的影响半径,而不是数接口个数。可以问一句:改这边是否总要在那边同步改?如果答案是经常,那么两个模块事实上属于同一个变更单元,边界画错了。另一个信号是参数形态:如果调用方需要构造对方的内部结构体才能调用,耦合已经不轻。

常见类型

类型含义风险
数据耦合只传递简单数据影响面小,最理想
标记耦合传递复合结构如整行记录字段变更波及双方
控制耦合传递开关决定被调方行为语义分散在调用方
公共耦合共享全局可变状态修改影响不可预测
内容耦合直接访问对方内部实现最高风险,改动无边界

降耦手段

  • 传简单数据,避免传整行记录或对方的内部结构体
  • 用返回值传递结果,不用输出参数与全局状态
  • 依赖接口而非具体类型,把实现选择推迟到运行期
  • 把同步调用改成事件通知,但要注意消费者回查成本
  • 按变更频率重组模块,把总是一起改的部分放在一起
  • 避免共享可变全局状态,用显式参数传递上下文
耦合评判要结合变化频率:稳定部分之间的强耦合可以接受,易变部分之间的强耦合才是债务来源。先看哪部分会变,再决定要不要解耦。

易错点

  • 用布尔开关参数控制分支形成控制耦合,调用方需要了解被调方实现细节
  • 通过全局配置对象在模块间传递状态,实际形成公共耦合,改动无法预测
  • 为了降低耦合把接口拆得极细,调用次数与数据组装成本大幅上升
  • 模块之间传递整行记录,字段一改就要同步改两侧,标记耦合反复引发缺陷

数据来源与参考

  • Constantine & Yourdon 结构化设计著作
  • 《软件架构:架构模式、特征及实践指南》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌