【软件工程】结构化设计:模块独立性与耦合内聚

考点频率 :★★★★★(上午题必考,下午题偶尔结合考查)

难度 :⭐⭐⭐

建议:重点掌握七种耦合的强弱排序、七种内聚的强弱排序,以及各自的典型场景

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. 公共耦合

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #耦合 #内聚 #模块独立性 #软件工程

相关推荐
Xiu Yan3 分钟前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖12 分钟前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理13 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
木头科技19 分钟前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
深盾科技_Virbox21 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
thefool11226622 分钟前
多线程 3
java
CoderYanger28 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
liangbo71 小时前
01-Java 集合框架全景:从 Collection 到 Map 一张关系网理清
java
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具