1. 结构化设计概览

1.1 核心思想

结构化设计(SD)方法主要面向数据流

  • 出发点:以数据流图(DFD)为基础。
  • 核心任务:将分析阶段产生的“分析模型”(如DFD、数据字典)转换为“设计模型”(软件结构图)。

1.2 设计的两个阶段

PPT明确将设计分为两个层次,这是考试中常见的概念辨析题

  1. 概要设计 (Overview Design)
    • 别名:结构设计、体系结构设计。
    • 任务:宏观布局。把系统的功能需求分配给软件结构,确定模块及模块间的调用关系。
    • 核心产物SC图 (Structure Chart)
    • 助教解释:就像盖房子画蓝图,决定哪里是客厅、哪里是卧室,以及它们之间怎么走通,但不管房间里具体装修。
  2. 过程设计 (Process Design)
    • 别名:详细设计。
    • 任务:微观实现。确定每个模块内部的算法和数据结构。
    • 核心工具N-S图、PAD图、PDL语言、IPO图
    • 助教解释:这就是具体的装修方案,决定每个房间的地板怎么铺,电路怎么走。

2. 概要设计核心工具:SC图 (结构图)

这是本章的绝对重点,请务必掌握如何看图和画图。

2.1 模块的六种类型

在SC图中,模块不仅仅是方框,它们有不同的功能角色:

  1. 传入模块:负责从下属模块获取数据,处理后传给上级(逻辑输入)。
  2. 传出模块:从上级获取数据,处理后传给下属(逻辑输出)。
  3. 变换模块 (加工模块)核心计算部分。将输入转换为输出(如“计算工资”、“计算最佳解”)。
  4. 源模块:产生数据。
  5. 漏模块:接收并消耗数据。
  6. 控制模块:负责调度和控制。

2.2 调用关系

  • 简单调用:A调用B。
  • 选择调用:A根据条件调用B或C(图标中有菱形符号)。
  • 循环调用:A重复调用B(图标中有弧形箭头)。
  • 重点注意:图中必须画出数据流(带空心圆的箭头)和控制流(带实心圆的箭头,虽然PPT主要强调数据流)。

3. 从DFD到SC图的转换 (核心考点)

如何把“数据流图”变成“程序结构图”?主要依据数据流的类型采用两种不同的分析方法。

3.1 变换分析 (Transform Analysis)

适用于:数据流具有明显的输入、变换(处理中心)、输出三个阶段。

  • 步骤
    1. 划界:在DFD上找到逻辑输入、逻辑输出和变换中心的边界。
    2. 建立框架:顶层设计一个主控制模块;第一层分解为“输入控制”、“变换控制”、“输出控制”三个分支。
    3. 分解
      • 输入分支:设计为“获取数据”的结构(Get/Read)。
      • 输出分支:设计为“发送数据”的结构(Put/Write)。
      • 变换分支:映射具体的计算处理模块。

3.2 事务分析 (Transaction Analysis)

适用于:数据流中存在一个明显的事务中心,数据到达这里后,根据输入类型触发不同的处理路径(如:菜单选择、命令分发)。

  • 步骤
    1. 识别事务中心:找到那个负责“分发任务”的加工。
    2. 建立框架
      • 顶层:事务控制模块。
      • 第一层:接收分支(获取事务类型) + 调度分支(根据类型调用不同处理模块)。
    3. 分解:针对每一条具体的事务动作路径进行细化。
  • 助教补充技巧
    • 如果DFD像一个哑铃(两头小中间大,中间是复杂的计算),用变换分析
    • 如果DFD像一个辐射状的太阳(一个点发散出多条路径),用事务分析
    • 实际系统中往往是混合结构

4. 优化设计的指导原则 (考试重点/简答题)

画出SC图后,必须根据以下原则进行优化:

4.1 模块独立性 (核心原则)

  • 高内聚 (High Cohesion):模块内部各元素联系越紧密越好。每个模块只做一件事。
  • 低耦合 (Low Coupling):模块之间联系越松散越好。少传参数,少用全局变量。

4.2 扇入与扇出 (Fan-in & Fan-out)

  • 扇出 (Fan-out):一个模块直接控制(调用)的下属模块数量。
    • 原则3-7为宜,最好不超过9。
    • 解释:管的人太多(扇出大)管不过来;管的人太少(扇出小)层级太深,效率低。
  • 扇入 (Fan-in):有多少个上级模块调用它。
    • 原则底层模块扇入越高越好
    • 解释:扇入高说明这个模块是通用的(如“计算税率”),复用性强。

4.3 作用域与控制域 (Scope of Effect vs. Scope of Control)

这是很多同学容易混淆的概念,必考

  • 控制域:模块本身及其所有下属模块的集合(权力的范围)。
  • 作用域:受该模块内一个判定影响的所有模块的集合(影响的范围)。
  • 核心规则作用域必须包含在控制域之内
    • 助教通俗解释:如果模块A做了一个决定(比如“是否通过审批”),这个决定影响了模块B的执行,那么模块B必须归模块A管(或者是模块A下属的下属)。如果B不归A管,A就得把这个决定层层上报再下传,不仅麻烦还容易出错(高耦合)。
    • 优化方法:如果作用域超出了控制域,要把做判定的模块位置上移,或者把受影响的模块下移

5. 过程设计 (详细设计)

这一阶段主要解决“怎么做”的问题,即算法实现。

5.1 结构化程序设计的三种基本结构

理论证明,任何程序都可以只用这三种结构实现:

  1. 顺序结构
  2. 选择结构 (If-Else, Switch)
  3. 循环结构 (While, Until)
  • 原则:单入口,单出口。尽量少用GOTO语句。

5.2 常用工具对比 (常考填空/选择)

工具名称 特点 优点 缺点
程序流程图 历史悠久,箭头表示控制流 直观 随意转移控制(这不符合结构化精神),不易表示数据结构
N-S图 (盒图) 像堆积木一样的方框 强制结构化,无GOTO,作用域清晰 修改麻烦
PAD图 二维树形结构 (问题分析图) 逻辑最清晰,支持自顶向下,易转为代码
PDL (伪代码) 混杂英语和自然语言 易写易读,可作为注释 不如图形直观
  • 重点练习:PPT最后布置了练习题,要求根据逻辑画出 程序流程图、N-S图、PAD图。建议你针对PPT第74、78、88页的例题亲手画一遍,这是必会的基本功。

6. 其他知识点

  • HIPO图:带编号的层次图 + IPO图(输入-处理-输出)。
  • 复审 (Review):设计完成后必须进行复审,包括“走查”(Walkthrough,非正式)和“正式复审”。目的是尽早发现错误。
  • Jackson方法:一种面向数据结构的设计方法(不同于SD的面向数据流)。它认为程序的结构应该对应数据的结构。

7. 助教总结 (Chapter Summary)

本章是软件工程中承上启下的关键章节。

  1. 核心任务是把分析阶段的“数据流图(DFD)”转化为设计阶段的“模块结构图(SC)”。
  2. 转换方法依据数据流特性分为“变换分析”和“事务分析”,实际设计中常结合使用。
  3. 评判标准是模块独立性(高内聚、低耦合),以及扇入扇出、作用域/控制域规则。
  4. 详细设计阶段,不要依赖传统的流程图,而应掌握N-S图PAD图这些更能体现结构化思想的工具。