软件设计中内聚与耦合层次识别与理解
大家好,我是架构师小蒽,为您趣味讲解软考高级架构师,系统分析师备考知识,希望能够在信息技术方面帮到您!分享内容不是课本知识的照搬,而是基于理解和项目实践的体会,如有疏忽不对的地方,欢迎指教。
下面是#系分架构100个知识点精讲内容专栏
在软件工程领域构建复杂系统时,开发者往往需要考虑:如何将庞大系统拆分为模块,并让这些模块既能高效协作,又能方便维护
说人话:为了方便程序模块的扩展与复用等需求,模块间应该如何“保持距离”,模块内部又该怎样“紧密结合”。

一、内聚(Cohesion)
原则:内聚越高越好,表示模块职责单一、清晰。
表示模块内部联系的紧密程度,从最密切到疏远
|
内聚类型 |
说明 |
示例 |
|
功能内聚 |
模块内所有元素共同完成一个单一的、明确的功能 |
一个 |
|
顺序内聚 |
模块内元素按顺序执行,上一个的输出是下一个的输入,且共享数据 |
先读取温度值,再根据温度计算冷却时间,最后输出控制信号 |
|
通信内聚 |
模块内元素操作同一个数据集(如同一数据结构或数据库表) |
多个函数都访问同一个订单表:新增、修改、删除订单 |
|
过程内聚 |
模块内元素按某种流程顺序执行,但之间不一定传递数据 |
一个“初始化设备”模块:先开电源,再自检,再设置参数,但彼此无数据依赖 |
|
时间内聚 |
模块内元素仅在时间上相关(如都必须在同一时间执行) |
一个“系统启动”模块:加载配置文件、初始化日志、连接数据库 |
|
逻辑内聚 |
模块内元素通过一个控制标志选择执行,逻辑上相关但功能不同 |
一个 |
|
偶然内聚、巧然内聚 |
模块内元素毫无关联,只是为了方便而放在一起 |
一个 |
在开发中,函数功能尽量单一设计,哪怕是Utils工具类都要进行细分,避免不相关的数据整合在一起。
二、耦合(Coupling)
原则:耦合越低越好,表示模块独立性强、修改影响小。
模块之间相互依赖的程度从最低程度到最高如下:
|
耦合类型 |
说明 |
示例 |
|
非直接耦合 |
两个模块之间没有直接的数据或控制联系,完全通过外层模块调用 |
非直接耦合指两个模块没有相互传递信息,各自独立。典型例子:两个互不调用的工具函数 |
|
数据耦合 |
模块之间通过参数传递基本数据类型(如 int, float)交换信息 |
|
|
标记耦合 |
模块之间传递数据结构(如记录、对象),但只使用其中部分字段 |
传递整个 |
|
控制耦合 |
一个模块向另一个模块传递控制信息(如标志位、命令码),使其执行不同逻辑 |
|
|
外部耦合 |
模块与外部环境(如 I/O、操作系统、硬件)交互,依赖外部约束 |
模块直接读写固定路径的文件 |
|
公共耦合 |
多个模块共享全局数据区(如公共变量、全局数据库表) |
模块 A、B、C 都读写同一个全局变量 |
|
内容耦合 |
一个模块直接访问另一个模块的内部数据或代码(如跳转到内部标号) |
模块 A 修改模块 B 的局部变量,或调用模块 B 的内部私有函数(汇编级跳转) |
在开发中,内容耦合是大忌,对后续的修改和扩展非常不友好,另外采用消息队列、通知订阅等方式实现解耦。
真题
请回答第1个问题
A:公共耦合 B:内容耦合 C:数据耦合 D:标记耦合
请回答第2个问题
A:过程内聚 B:顺序内聚 C:逻辑内聚 D:时间内聚
答案:1:A 2:A
作者简介:知行小蒽,一个喜欢演讲写作的10年IT老兵,擅长中大型信息系统解决方案咨询规划、架构分析设计、APP网站设计开发上线,欢迎私信交流!
夜雨聆风