首页/开发/代码质量与评审速查/高内聚与低耦合:怎么度量、怎么改
设计原则与模式62 条

高内聚与低耦合:怎么度量、怎么改

高内聚指模块内部元素围绕同一目的,低耦合指模块间依赖尽量少而稳;两者通常同向变化;工具上可用扇入扇出、不稳定度等指标做观察,最终仍以变更成本为准。

高内聚与低耦合

高内聚指模块内部的元素围绕同一目的,低耦合指模块之间的依赖尽量少而稳定。两者通常同向变化:把职责按变化原因聚拢,跨模块依赖会自然减少;随意拆分会制造大量细碎依赖。工具上可以用扇入、扇出、不稳定度等指标观察,但最终判据仍是变更成本。

基本信息

内聚模块内部元素是否围绕同一目的
耦合模块之间依赖的数量与稳定性
常见指标扇入、扇出、不稳定度、变更耦合
方向核心模块宜稳定,边缘与适配层可以有更多依赖
最终判据改一处需要动多少模块

典型使用场景

  • 判断某个类是否该拆分或合并
  • 评审时评估新引入的跨模块依赖方向
  • 重构前先看清哪些模块总是一起被改
  • 核心与边缘模块使用不同的稳定性要求
  • 观察架构腐化趋势,而不是只看单次改动

结构改善方向

结构改善方向
// 高耦合:订单模块直接写库存表、发短信、跑报表
// 低耦合:订单依赖库存端口与通知端口,适配器各自实现
class OrderService {
    OrderService(InventoryPort inventory, Notifier notifier) { ... }
}
// 依赖方向稳定后,替换实现不必改动业务逻辑

常用观察指标

指标含义方向
扇入 fan-in被多少模块依赖高说明是稳定核心
扇出 fan-out依赖了多少模块高说明较脆弱
不稳定度依赖数与承接数之比核心宜低、边缘可高
变更耦合经常一起改动的模块高说明边界可疑
指标只用来提示可疑点:一个模块扇出很高,但每次改动只影响它自己,未必是问题;反过来,指标好看但改一处要动七八个模块,才是真正需要处理的对象。
不要一味把耦合压到零:必要的协作被拆散后业务流程会碎片化,调用方要在多个模块之间拼装,整体复杂度反而上升。

易错点

  • 只看静态依赖不看运行时调用:关键耦合被漏判,改到线上才发现
  • 一味压低耦合到零:必要协作被拆散,流程碎片化
  • 按文件行数判断内聚:代码量小的类也可能混着两类职责
  • 为了指标好看做拆分:模块数量上升,变更成本反而变大

数据来源与参考

  • Robert C. Martin 组件耦合度量(《Clean Architecture》);软件度量通识
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌