考点频率:★★★★☆(选择题常考,下午题偶尔结合DFD考查)
难度:⭐⭐⭐
建议:重点掌握SC图与DFD的关系、模块划分原则,以及两种映射方法
1️⃣ 从DFD到SC图:从“分析”到“设计”
上一篇文章我们讲了结构化分析方法(SA),核心工具是DFD,回答的是“系统做什么”——把用户需求画成数据流图。
结构化设计方法(SD)则是回答“系统怎么做”——把DFD中的数据处理逻辑,转化为程序模块结构。
数据流图(DFD)是需求分析阶段的产物,描述数据在系统中的流动和处理过程,关注“系统要做什么”,面向的是问题域。
结构图(SC图)是概要设计阶段的产物,描述程序模块的层次结构和调用关系,关注“系统怎么做”,面向的是解决方案域。
打个比方:
- DFD = 厨房里菜从哪来、经过哪些步骤、最终变成什么菜(数据流动)
- SC图 = 厨房里谁负责洗菜、谁负责切菜、谁负责炒菜、谁向谁汇报(人员分工)
需求阶段画DFD,设计阶段画SC图——先搞清楚“要做哪些事”,再决定“派谁去做、谁听谁的”。
2️⃣ 结构图(SC图)的图形符号
SC图主要描述模块之间的调用关系和数据传递:
| 图形符号 | 含义 | 说明 |
|---|---|---|
| 矩形框 | 模块 | 框内写模块名称(动词+名词) |
| 带箭头的线段 | 调用关系 | 上层调用下层 |
| 箭头旁的标注 | 数据传递 | 用 ○ 标记数据/控制信息 |
| 空心菱形 | 选择调用 | 根据条件决定是否调用 |
| 带弧线的箭头 | 循环调用 | 重复调用若干次 |
┌─────────────┐ │ 主控模块 │ └──────┬──────┘ │ ┌───────────┼───────────┐ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ 输入模块 │ │ 处理模块 │ │ 输出模块 │ └───────────┘ └───────────┘ └───────────┘考试提示:SC图是树形结构,没有交叉线。如果有交叉,说明模块划分有问题。
3️⃣ SC图的补充概念(易混淆考点)
在软件设计师考试中,SC图经常与模块的“扇入/扇出”“深度/宽度”等度量指标结合考查。
3.1 扇入与扇出
| 概念 | 定义 | 对设计质量的影响 |
|---|---|---|
| 扇出(Fan-out) | 某模块直接调用的下层模块数量 | 扇出过大(>7)说明模块可能过于复杂,承担了过多职责;扇出过小可能意味着下层模块划分过细。建议控制在3~7之间。 |
| 扇入(Fan-in) | 直接调用某模块的上层模块数量 | 扇入越大越好,说明该模块被多处复用,抽象程度高。在图中表现为多个模块调用同一底层模块(如公用工具函数),扇入越大通常意味着模块的通用性越强。 |
结合实例:一个“数据校验”模块被登录、注册、下单三个模块调用,则该校验模块的扇入为3。
3.2 深度与宽度
| 概念 | 定义 | 设计指导意义 |
|---|---|---|
| 深度(Depth) | SC图中从根节点到最远叶节点的层数 | 深度过大可能说明控制链太长,逻辑分散,增加了理解难度和维护成本 |
| 宽度(Width) | SC图中同一层级的最大模块数 | 宽度受扇出控制,宽度过大说明该层抽象层次可能不够一致 |
4️⃣ 从DFD到SC图的两种映射方法
这是软考下午题可能考查的难点:如何把DFD的结构转化为SC图?
取决于DFD中数据流的特征,有两种映射方式:
4.1 变换流映射(处理事务流的数据)
适用场景:DFD中的数据流是“输入 → 加工 → 输出”的线性流水线结构。即数据先经过一系列输入处理(对输入数据进行清洗、转换、格式调整,准备好供核心计算使用),然后交给主加工(对输入的数据进行核心业务计算和逻辑处理),最后再经过一系列输出处理(对结果进行格式化、汇总、展示给用户)。
映射步骤:
- 在DFD中找到主加工(中心变换)——数据真正发生“转化”的位置
- 把主加工映射为SC图中的主模块
- 输入流部分映射为输入模块(负责接收和预处理数据)
- 输出流部分映射为输出模块(负责结果处理和展示)
举例:一个工资计算系统,输入是“员工考勤数据”,主加工是“计算工资”,输出是“工资单”。映射为SC图就是三个模块:输入模块、工资计算模块、输出模块。
4.2 事务流映射(根据类型分支处理)
适用场景:DFD中有一个“事务中心”,根据输入数据的类型或条件,选择不同的处理路径。
映射步骤:
- 在DFD中找到事务中心(决定走哪条路的加工)
- 事务中心映射为SC图中的事务调度模块
- 每条处理路径分别映射为一个动作模块(一组完成特定功能的模块)
举例:一个订单处理系统,根据订单类型(普通/加急/国际)走不同的处理流程。映射为SC图就是:事务调度模块 → 普通订单处理、加急订单处理、国际订单处理三个分支。
5️⃣ 模块划分的基本原则(高内聚低耦合)
SC图的设计核心是模块划分,目标是高内聚、低耦合:
| 原则 | 含义 | 好坏判断 |
|---|---|---|
| 高内聚(High Cohesion) | 一个模块内部各个元素之间关联紧密,共同完成一个功能 | 好设计:模块职责单一明确;坏设计:一个模块既做计算又写日志 |
| 低耦合(Low Coupling) | 模块之间的依赖关系尽量少,修改一个模块不影响其他模块 | 好设计:模块通过参数传递数据;坏设计:模块直接修改全局变量 |
模块规模:一个模块的代码行数建议控制在50~200行以内。模块过大会导致内聚度降低、可读性变差、维护困难。如果模块代码量显著超出这个范围,应考虑进一步拆分。
耦合强弱排序(由低到高):
数据耦合 ← 控制耦合 ← 公共耦合 ← 内容耦合
(数据耦合最理想,内容耦合最差)
内聚强弱排序(由高到低):
功能内聚 ← 顺序内聚 ← 通信内聚 ← 过程内聚 ← 逻辑内聚 ← 偶然内聚
(功能内聚最理想,偶然内聚最差)
这部分内容将在下一篇文章中详细展开,本篇仅作了解。
6️⃣ 经典例题
例题1:以下关于SC图的叙述中,正确的是( )。
A. SC图是面向数据流的设计工具,用于描述数据在系统中的流动
B. SC图反映的是模块之间的调用关系
C. SC图主要用于详细设计阶段
D. SC图可以包含循环结构但不能包含选择结构
解析:A错误——描述数据流动的是DFD,不是SC图;C错误——SC图用于概要设计阶段,不是详细设计(详细设计常用程序流程图、判定表等);D错误——SC图可以包含选择结构和循环结构(用空心菱形和带弧线的箭头表示)。B正确。选B。
例题2:某DFD中有一个加工“计算工资”,该加工接受“考勤数据”输入,产生“工资明细”输出。在SC图中,“计算工资”应该被映射为( )。
A. 输入模块
B. 主模块
C. 输出模块
D. 事务调度模块
解析:这是一个典型的变换流结构,“计算工资”是数据真正发生“转化”的加工,应映射为主模块。选B。
7️⃣ 记忆口诀
SC图树形结构,模块调用看箭头。
扇出控制子模块数(3~7),扇入越大复用度越高。
变换流映射线性路,事务流映射分支走。
高内聚低耦合,模块设计好帮手。
8️⃣ 小测验(评论区对答案)
在SC图中,如果某个模块被其他5个模块调用,则该模块的扇入为( )。在分层DFD中,父图与子图的输入输出数据流必须在数量和名称上保持一致,这种做法通常被称为( )。
A. 5;平衡
B. 4;平衡
C. 5;一致性
D. 4;一致性
🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #结构图 #SC图 #结构化设计 #软件工程