知识卡片
高内聚低耦合与Sam Newman定义的四种耦合类型
内容
内聚和耦合是一对互斥、需要小心平衡的力,目标是康斯坦丁定律描述的状态:”如果内聚度高、耦合度低,那么结构就是稳定的”。内聚关乎代码的组织方式和每个组件内部代码的关联程度,Sam Newman的表述是”需要一起修改的代码,就要放在一起”——理想情况下,一次业务功能变更应该只改动一个组件。耦合则意味着组件需要同步变更,Sam Newman把它拆成四种类型:实现耦合(别的组件依赖了你组件内部的实现细节,典型例子是别人直接查询你的数据库表,导致你之后很难改表结构);时间耦合(分布式系统中的同步通信让你依赖对端服务此刻的可用性,用消息系统能缓解,因为接收者不必在你发消息的瞬间就在线);部署耦合(为了跑起来必须整体重新部署一个部署单元,即使大部分制品没变,极端形式是”发布列车”——被迫和其他项目在一次更大的发布任务中捆绑上线);领域耦合(面向最终用户的有意义业务功能之间存在天然依赖,例如发货服务不关心支付细节,但必须确保只有支付成功的订单才会发货)。前三种耦合通常可以设法避免,而领域耦合除非改变业务需求本身,否则无法真正消除——但可以通过谨慎设计组件边界(领域驱动设计正是为此服务)来把领域耦合控制在最小、最清晰的范围内。
结构图:
flowchart TD
A[耦合的四种类型] --> B[实现耦合<br/>依赖对方内部实现细节,如直接查表]
A --> C[时间耦合<br/>同步通信依赖对端此刻可用]
A --> D[部署耦合<br/>必须整体重新部署,极端形式=发布列车]
A --> E[领域耦合<br/>业务功能间天然依赖,如发货依赖支付成功]
B -.可避免.-> F[通过接口/API隐藏实现]
C -.可缓解.-> G[改用消息系统异步通信]
D -.可避免.-> H[独立可部署的服务边界]
E -.不可消除.-> I[只能靠边界设计控制范围,DDD是关键工具]
参考来源
- 位置:《流程自动化实战:系统架构和软件开发视角》第7章《自治、边界和隔离》"7.1 高内聚低耦合"(源文件:_epub-src/EPUB/xhtml/Section0001_0011.xhtml)
- 结论依据:原文引用康斯坦丁定律定义稳定结构的标准,并逐条给出Sam Newman四种耦合类型的定义与例子,明确指出前三种可避免、领域耦合无法真正消除,直接支撑本卡片的结构图与解释。
- 原始内容:如果内聚度高,耦合度低,那么结构就是稳定的……你可能能避免实现耦合、时间耦合或者部署耦合,通常也建议你这样做,但除非你更改业务需求,否则无法消除领域耦合。