考点频率 :★★★★★(上午题必考,下午题偶尔结合考查)
难度 :⭐⭐⭐
建议:重点掌握七种耦合的强弱排序、七种内聚的强弱排序,以及各自的典型场景
1️⃣ 什么是模块独立性?
模块独立 是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。通俗地说:各干各的活,互相少打扰。
一个模块越独立,它就越容易被理解、测试、修改和复用。如果模块之间纠缠不清,改一个地方就要改一片------这就是软件工程里常说的"牵一发动全身"。
衡量模块独立程度有两个定性标准 :耦合 和 内聚。
设计目标 :高内聚、低耦合------模块内部要"抱得紧",模块之间要"离得远"。
2️⃣ 耦合(Coupling):模块之间的"关系"
耦合是模块之间互相连接的紧密程度的度量。耦合度越高,模块独立性越差。
耦合的强弱取决于三个因素:
- 模块之间接口的复杂程度
- 调用模块的方式
- 通过接口传递的信息类型
耦合的七种类型(从低到高排列)
| 等级 | 耦合类型 | 说明 | 典型场景 |
|---|---|---|---|
| 最低 | 无直接耦合 | 两个模块之间没有直接关系,不传递任何信息 | 两个独立工具函数,互不调用 |
| ↓ | 数据耦合 | 传递的是简单数据值(相当于值传递) | 调用 calculate(a, b) 传递两个整数 |
| ↓ | 标记耦合 | 传递的是数据结构(如整个对象或结构体) | 传递一个 User 对象给另一个模块 |
| ↓ | 控制耦合 | 传递的是控制变量,被调用模块根据该变量选择执行哪个功能 | 传入 actionType=1 让模块决定执行A还是B |
| ↓ | 外部耦合 | 模块通过软件之外的环境联结(如I/O设备、通信协议) | 多个模块读写同一个配置文件 |
| ↓ | 公共耦合 | 通过公共数据环境(如全局变量、共享内存)相互作用 | 多个模块直接读写同一个全局数组 |
| 最高 | 内容耦合 | 一个模块直接使用另一个模块的内部数据,或通过非正常入口进入 | 模块A直接访问模块B的私有变量 |
记忆顺口溜 (由高到低 → 由低到高反向记):接 数 标 制 外 共 容(从低到高:无直接→数据→标记→控制→外部→公共→内容)
关键理解:
- 数据耦合和标记耦合的区别在于:传递的是简单值 还是数据结构
- 控制耦合的特征是传递控制信息(如标志位、命令码),被调用模块根据它选择执行路径
- 内容耦合是最差 的耦合,应当完全避免
3️⃣ 内聚(Cohesion):模块内部的"团结"
内聚是一个模块内部各个元素彼此结合的紧密程度的度量。内聚度越高,模块独立性越强。
一个内聚程度高的模块,应当只做一件事。
内聚的七种类型(从低到高排列)
| 等级 | 内聚类型 | 说明 | 典型场景 |
|---|---|---|---|
| 最低 | 偶然内聚(巧合内聚) | 模块内各处理元素之间没有任何联系 | 把几个不相关的工具函数塞进一个"Utils"模块 |
| ↓ | 逻辑内聚 | 执行若干个逻辑上相似的功能,通过参数决定执行哪一个 | 一个 printReport(type) 函数根据type打印不同报表 |
| ↓ | 时间内聚 | 把需要同时执行的动作组合在一起 | 系统启动时的初始化模块(读配置、建连接、加载缓存) |
| ↓ | 过程内聚 | 完成多个任务,这些任务必须按指定的过程顺序执行 | 一个模块按顺序执行"读文件→处理数据→写结果" |
| ↓ | 通信内聚 | 所有处理元素都在同一个数据结构上操作 | 对同一张数据表进行增、删、改、查的模块 |
| ↓ | 顺序内聚 | 各处理元素密切相关于同一功能且必须顺序执行,前一元素的输出是下一元素的输入 | 输入数据→校验数据→格式化数据→输出数据 |
| 最高 | 功能内聚 | 所有元素共同作用完成一个功能,缺一不可 | 一个 calculateTax(income) 函数只做计算税额这一件事 |
记忆顺口溜 (由弱到强):偶 逻 时 过 通 顺 能
关键理解:
- 过程内聚 和顺序内聚 容易混淆:
- 过程内聚:强调执行顺序,但各步骤之间不一定有数据传递关系
- 顺序内聚:强调数据流,前一步的输出是后一步的输入
- 功能内聚是最高级别的内聚,是设计的理想目标
4️⃣ 高内聚、低耦合:模块设计的黄金法则
耦合和内聚是同一枚硬币的两面:
- 模块内部联系越紧密 → 内聚越高 → 模块独立性越强
- 模块之间联系越少 → 耦合越低 → 模块独立性越强
为什么要追求高内聚、低耦合?
- 可读性强:每个模块只做一件事,容易理解
- 易维护:修改一个模块不影响其他模块
- 易复用:独立的模块可以在其他项目中直接使用
- 易测试:模块功能单一,测试用例清晰
5️⃣ 经典例题
例题1 (2019上·上午题):已知模块A给模块B传递数据结构X,则这两个模块的耦合类型为( )。
A. 数据耦合 B. 公共耦合 C. 外部耦合 D. 标记耦合
解析 :传递的是数据结构 (非简单数据值)→ 标记耦合。如果传递的是简单数据值,才是数据耦合。
答案:D
例题2 (2019下·上午题):某模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一元素的输出就是下一元素的输入,则该模块的内聚类型为( )。
A. 过程内聚 B. 时间内聚 C. 顺序内聚 D. 逻辑内聚
解析 :关键词是"前一元素的输出就是下一元素的输入"------这是顺序内聚的典型特征。过程内聚只强调执行顺序,不强调数据传递关系。
答案:C
例题3:模块A直接访问模块B的内部数据,则模块A和模块B的耦合类型为( )。
A. 数据耦合 B. 标记耦合 C. 公共耦合 D. 内容耦合
解析 :直接使用另一个模块的内部数据 → 内容耦合。这是耦合程度最高的类型,应当完全避免。
答案:D
6️⃣ 记忆口诀
耦合看模块间,内聚看模块内。
耦合越低越好,内聚越高越妙。
七种耦合从低到高:无数标制外公内。
七种内聚从低到高:偶逻时过通顺能。
7️⃣ 小测验(评论区对答案)
某系统中,模块M1调用模块M2时传递了一个布尔值
isValid,M2根据该值决定执行校验通过后的处理逻辑还是错误处理逻辑。则M1和M2之间的耦合类型为( )。A. 数据耦合
B. 标记耦合
C. 控制耦合
D. 公共耦合
🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #耦合 #内聚 #模块独立性 #软件工程