【软考架构】内聚与耦合

下面按从高到低逐一解释这七种内聚类型。判断内聚高低的核心标准是:模块内部各成分之间是"为什么"联系在一起------是因为共同完成一个单一功能,还是仅仅因为碰巧放在一起。


1. 功能内聚(Functional Cohesion)------最高

定义 :模块内所有成分共同协作,完成一个单一、明确的功能,缺一不可。

特点:

  • 模块只有一个功能目标,所有语句都为这个目标服务;
  • 各部分联系最紧密,职责最单一;
  • 模块独立性最好,最易理解、测试、复用和维护。

示例:

  • 一个 calculateTax() 模块,只负责计算税额;
  • 一个 sortArray() 模块,只负责排序。

判断:如果去掉任何一部分,功能就不完整;如果只保留一部分,功能也无法独立成立。


2. 顺序内聚(Sequential Cohesion)

定义 :模块内各成分按顺序执行,前一部分的输出是后一部分的输入,共同完成一个较大功能。

特点:

  • 成分之间有数据依赖,必须按顺序执行;
  • 比功能内聚稍弱,因为模块承担了多个步骤,但步骤间联系紧密;
  • 通常可以进一步拆分,但拆开后需要传递数据。

示例:

  • 一个模块先读取文件,再解析内容,最后输出结果;
  • getAndValidateUser():先查询用户,再校验用户状态。

判断:前一步的输出直接作为后一步的输入,形成流水线。


3. 通信内聚(Communication Cohesion)

定义 :模块内各成分操作同一组数据,但彼此执行顺序不一定固定,也不一定有输入输出关系。

特点:

  • 成分之间通过共享同一数据结构联系在一起;
  • 比顺序内聚弱,因为各成分可以独立执行,只是数据相同;
  • 常见于对同一记录进行多种操作。

示例:

  • 一个模块对同一个学生记录分别执行:计算平均分、打印成绩单、更新排名;
  • 一个模块对同一个订单对象执行:计算总价、计算税费、生成发票。

判断:大家围绕"同一份数据"工作,但彼此不一定是前后依赖。


4. 过程内聚(Procedural Cohesion)

定义 :模块内各成分必须按特定顺序执行 ,但彼此之间没有数据传递,只是控制流程要求它们按次序进行。

特点:

  • 强调"执行顺序",而不是数据依赖;
  • 比通信内聚弱,因为成分之间联系只是流程上的;
  • 常见于初始化、清理等过程。

示例:

  • 一个模块依次执行:打开日志文件、初始化配置、启动服务;
  • 一个模块依次执行:关闭连接、释放内存、写结束日志。

判断:必须按顺序做,但前一步的结果不一定是后一步的输入。


5. 时间内聚(Temporal Cohesion)

定义 :模块内各成分因为需要在同一时间段内执行而被放在一起,彼此功能上不一定相关。

特点:

  • 联系点是"时间",不是功能、数据或流程;
  • 比过程内聚弱,因为顺序可能不严格,成分之间逻辑关系松散;
  • 典型是初始化模块、异常处理模块。

示例:

  • 系统启动模块:初始化变量、打开文件、加载配置、启动定时器;
  • 系统关闭模块:保存状态、关闭文件、释放资源、写日志。

判断:它们"都在系统启动时做",但彼此不一定有直接关系。


6. 逻辑内聚(Logical Cohesion)

定义 :模块内各成分在逻辑上属于同一类操作,通过参数选择执行其中某一部分,但每次只执行其中一条逻辑分支。

特点:

  • 成分之间只是"类别相同",实际执行时通常只选一个;
  • 比时间内聚弱,因为模块内部包含多条互斥逻辑;
  • 模块接口复杂,调用者需知道传什么参数,容易产生耦合。

示例:

  • 一个 output(data, type) 模块,根据 type 决定输出到屏幕、打印机或文件;
  • 一个 handleError(code) 模块,根据错误码执行不同处理。

判断:它们"都属于输出/错误处理这一类",但具体逻辑彼此独立。


7. 偶然内聚(Coincidental Cohesion)------最低

定义 :模块内各成分之间没有任何实质性联系,只是碰巧被放在同一个模块里。

特点:

  • 内聚最低,模块内部杂乱无章;
  • 难以理解、测试、维护和复用;
  • 修改一处可能影响其他无关部分。

示例:

  • 一个工具模块里同时放了:计算平方根、打印欢迎语、打开数据库连接;
  • 一个 utils 模块里塞了各种互不相关的小函数。

判断:问"为什么这些代码在一起?"答案是"没什么原因,就放一起了"。


总结对比

内聚类型 联系纽带 强弱 一句话理解
功能内聚 共同完成单一功能 最高 只做一件事
顺序内聚 输出→输入,顺序依赖 高 流水线前后工序
通信内聚 操作同一组数据 较高 围绕同一份数据干活
过程内聚 必须按固定顺序执行 中 按流程排队,但无数据传递
时间内聚 同一时间段执行 较低 都在启动/关闭时做
逻辑内聚 逻辑上同类,参数选择 低 一类操作塞进一个模块
偶然内聚 无实质联系 最低 碰巧放在一起

记忆口诀

功顺通过时逻偶------功能 > 顺序 > 通信 > 过程 > 时间 > 逻辑 > 偶然。

设计时应尽量追求功能内聚 和顺序内聚 ,避免逻辑内聚 和偶然内聚;通信内聚和过程内聚可作为折中,时间内聚要谨慎使用。

相关推荐
burg_xun5 小时前
【生命科学 Agent】推理平台(二)
人工智能·程序人生·系统架构
gz927cool14 小时前
在 Harness 上搭建 Agent-Native 应用:可迁移经验
服务器·人工智能·ai·系统架构
桃花键神16 小时前
GR00T N1 —— 双系统架构如何让一个模型驱动不同人形机器人
系统架构·机器人
我喜欢就喜欢1 天前
豆包赋能抖音生态:从内容创作到运营提效的全景应用
人工智能·系统架构
dishugj1 天前
https://blog.csdn.net/dishugj/article/details/162068579
数据库·系统架构
希赛网2 天前
2026下半年系统架构设计师考前20问
系统架构·软考高级·系统架构设计师·软考高级架构师·软考高级系统架构设计师
辛迪聊物业数字化2 天前
中小物业SaaS系统架构设计:从收费、巡检到IoT对接的落地实践
物联网·系统架构
各类产品分享2 天前
工厂 AR 巡检系统架构设计与落地难点解析
系统架构·ar·ar巡检