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

考点频率:★★★★★(上午题必考,下午题偶尔结合考查)
难度:⭐⭐⭐
建议:重点掌握七种耦合的强弱排序、七种内聚的强弱排序,以及各自的典型场景

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

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

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