

下面按从高到低逐一解释这七种内聚类型。判断内聚高低的核心标准是:模块内部各成分之间是"为什么"联系在一起------是因为共同完成一个单一功能,还是仅仅因为碰巧放在一起。
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模块里塞了各种互不相关的小函数。
判断:问"为什么这些代码在一起?"答案是"没什么原因,就放一起了"。
总结对比
| 内聚类型 | 联系纽带 | 强弱 | 一句话理解 |
|---|---|---|---|
| 功能内聚 | 共同完成单一功能 | 最高 | 只做一件事 |
| 顺序内聚 | 输出→输入,顺序依赖 | 高 | 流水线前后工序 |
| 通信内聚 | 操作同一组数据 | 较高 | 围绕同一份数据干活 |
| 过程内聚 | 必须按固定顺序执行 | 中 | 按流程排队,但无数据传递 |
| 时间内聚 | 同一时间段执行 | 较低 | 都在启动/关闭时做 |
| 逻辑内聚 | 逻辑上同类,参数选择 | 低 | 一类操作塞进一个模块 |
| 偶然内聚 | 无实质联系 | 最低 | 碰巧放在一起 |
记忆口诀
功顺通过时逻偶------功能 > 顺序 > 通信 > 过程 > 时间 > 逻辑 > 偶然。
设计时应尽量追求功能内聚 和顺序内聚 ,避免逻辑内聚 和偶然内聚;通信内聚和过程内聚可作为折中,时间内聚要谨慎使用。