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

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

难度 :⭐⭐⭐

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

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

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

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

相关推荐
乐观的Terry1 小时前
3、数据库设计与领域实体
java·数据库·spring boot·spring cloud·ai编程
程高兴1 小时前
PMSM基于在线转动惯量辩识的滑模负载转矩观测器MATLAB-SIMULINK仿真模型
开发语言·matlab
kisloy2 小时前
【python零基础教程第24讲】代码规范与质量管控
开发语言·python
C++、Java和Python的菜鸟2 小时前
第4章 后端Web基础(基础知识)
java·开发语言
芷栀夏2 小时前
Java教育平台实战复盘:课程、考试与学习行为分析系统设计
java·开发语言·学习
从零开始的代码生活_2 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
xywww1682 小时前
AWS 账号权限怎么分:根用户和 IAM 用户区别及日常使用建议
大数据·开发语言·人工智能·python·gpt·云计算·aws
维基框架2 小时前
维基框架(Wiki-Framework) 1.2.0:Mybatis 升级为主从读写分离
java·后端·架构
Memory_荒年2 小时前
Java函数式接口:把代码变成“拼乐高”的快乐,你体验过吗?
java