Introduction to Software Engineering(TE)

发布于:2025-06-27 ⋅ 阅读:(11) ⋅ 点赞:(0)

Program Design Language

也称为:伪代码语言(Pseudo-code Language)

PDL 的同类(或相关替代)

名称 简介 是否代码结构化
流程图 (Flowchart) 用图形方式描述处理逻辑
伪代码 (Pseudo-code) 通用术语,PDL就是一种伪代码形式
UML 活动图 建模工具中的一种行为建模方式,用于描述过程流程
Nassi-Shneiderman图 结构化图形流程图(无分支线),适用于结构化编程表示
结构化英语 类似自然语言的方式,但带有结构化控制词(如 IF-THEN)

SC 图(Structure Chart,结构图)

  • 结构化程序设计中用于承上启下的工具

  • 位于概要设计和详细设计的衔接位置

  • 主要用于:

    • 表示模块之间的调用关系

    • 表达系统的模块分解层次结构

    • 指明模块之间数据流或控制流的方向

所以,SC 图是概要设计的输出,同时也是详细设计的输入依据,用于指导每个模块内部的 PAD 图或伪代码设计。

DFD 图(数据流图)

  • 用于需求分析阶段

  • 表示数据在系统中的流动和处理过程

  • 不是用来连接设计阶段的工具

PAD 图(Problem Analysis Diagram)

  • 又称“问题分析图”或“过程设计图”

  • 属于详细设计阶段的工具

  • 用于描述单个模块内部的具体实现逻辑

  • 它是SC 图的下级实现图,并不用于“衔接”

程序流程图(Flowchart)

  • 一种早期的通用图形表示法

  • 表达过程控制逻辑,但缺乏模块化、结构化设计特征

  • 不适合用于大规模系统设计的层级表达

按照软件开发阶段的逻辑顺序如下:

阶段 图形工具 中文名称 作用说明
1. 需求分析 DFD 图 数据流图 分析系统做什么,表达数据如何流动
2. 概要设计 SC 图 结构图 把系统分成多个模块,表达模块间调用结构
3. 详细设计 PAD 图 过程设计图 描述某个模块“内部怎么做”
4. 编码辅助 流程图 程序流程图 可选工具,适合小模块的过程控制逻辑表达

常见耦合类型(由强到弱)

耦合类型 英文名 简要说明 强弱级别
内容耦合 Content Coupling 一个模块直接修改/访问另一个模块内部数据或逻辑 ❌ 最强(最差)
控制耦合 Control Coupling 一个模块控制另一个模块的执行逻辑(如传入标志位) 较强
公共耦合 Common Coupling 多个模块共享全局变量 中等
数据耦合 Data Coupling 模块间仅通过参数传递必要数据,不含控制信息或全局变量 ✅ 最弱(最好)

“软件结构使用的图形工具

选项 图形工具名称 英文缩写 用途说明
A 数据流图 DFD (Data Flow Diagram) 用于需求分析阶段,描述数据流转而非结构
B 过程设计图 PAD (Problem Analysis Diagram) 用于详细设计阶段,描述模块内部逻辑
✅ C 结构图 SC (Structure Chart) ✅ 用于描述软件模块结构和调用关系
D 实体-联系图 ER (Entity-Relationship Diagram) 用于数据库设计,描述实体与关系结构
序号 中文名称 英文缩写 简述
内容耦合 Content Coupling 直接访问另一个模块内部数据或控制其逻辑
公共耦合 Common Coupling 多模块共享全局变量
控制耦合 Control Coupling 一个模块控制另一个模块的执行逻辑(如传标志)
标记耦合 Stamp Coupling 传递的数据结构包含对方不需要的字段
数据耦合 Data Coupling 只通过必要数据参数进行交互
非直接耦合 Non-direct Coupling(非标准) 基本上无任何调用关系、数据关系
无耦合 No Coupling 完全独立

📌 注:不同教材中“非直接耦合”有时不列入七种之一,而是作为“最低耦合”或“理想情况”补充出现。

  • “问题域对象”即系统要解决的问题空间中真实存在的实体(例如:图书馆系统中的“图书”、“借阅者”、“借书记录”)。

  • 识别这些对象,是将现实问题映射到程序世界的第一步。

概念 英文缩写/词组 说明
面向对象分析 OOA (Object-Oriented Analysis) 识别对象与需求建模
问题域对象 Problem Domain Objects 分析对象模型的核心内容
面向对象设计 OOD (Object-Oriented Design) 描述对象结构和交互(设计层面)

面向对象分析过程中常见的三类模型:

模型类型 说明 代表图形工具/建模图
对象模型 表示系统中涉及的类、对象、属性、操作、关系等结构 类图(Class Diagram)
功能模型 描述系统要完成的功能与输入输出之间的变换关系 数据流图(DFD)、用例图(Use Case)
动态模型 表示对象如何随时间变化、如何响应事件、状态如何迁移等 状态图、时序图(Statechart / Sequence)
DFD Data Flow Diagram 功能建模工具之一
UML Unified Modeling Language 通用建模语言(统一建模)

“建模、分析这些活动有没有标准的先后顺序,还是说存在多种流程方法?”

既有经典标准顺序(常见于传统模型),也存在多种变体流程(如敏捷、迭代、原型方法)
也就是说,不同的软件开发方法论中,这些活动的顺序可能固定交错、或者反复回溯

标准的“瀑布模型”顺序(最典型的线性流程)

这种是传统软件工程中最明确的阶段性流程:

阶段 主要活动 常用建模工具/方法
① 可行性研究 立项、成本估算、风险分析 无建模,主要是文档+表格
② 需求分析 明确系统做什么 DFD(数据流图)、ER图、用例图
③ 概要设计 系统如何分模块 SC图(结构图)、模块图
④ 详细设计 每个模块怎么实现 PAD图、伪代码、类图、状态图等
⑤ 编码实现 编写源代码 编程语言 + 编码规范
⑥ 测试验证 检查是否满足需求 单元测试、集成测试、验收测试等
⑦ 部署运维 上线并维护 日志监控、用户反馈系统

📌 在这个模型中,每一步都严格在前一步完成后进行,所以“建模”通常穿插在第 2–4 阶段。

面向对象开发模型中的顺序(适配 UML 流程)

UML 方法论中推荐的是一种“逐步细化、结构清晰”的过程,顺序如下:

步骤 活动内容 对应模型/图形工具
1. 领域建模 抽象出问题空间的对象和关系 类图、对象图
2. 用例建模 从用户视角分析功能需求 用例图(Use Case Diagram)
3. 静态建模 描述系统结构(类、关系、继承等) 类图、包图等
4. 动态建模 描述行为随时间变化(状态/交互) 状态图、时序图
5. 交互建模 表现对象间如何协作完成用例 通信图、协作图
6. 实现建模 映射到代码结构 部署图、组件图

📌 这些建模活动可以并行推进,但通常建议先有静态结构,再逐步补充行为与交互。

敏捷开发中的建模顺序:没有固定顺序,更强调迭代

  • **敏捷开发(Agile)**不强调一次性完成建模或设计,而是:

    • 快速识别最关键用例/对象

    • 快速建立最小可行产品(MVP)

    • 不断从用户反馈中修正模型与代码

    • 建模工具以轻量、可沟通为主,比如手绘用例图或白板类图

常见的模型构建流程对比总结

方法模型 活动顺序是否固定 是否强调建模 特点说明
瀑布模型 ✅ 固定顺序 ✅ 严格建模 适合需求稳定、流程清晰的项目
统一过程(RUP) ✅ 分阶段进行 ✅ 全建模 面向对象项目的标准流程,强调文档与模型
敏捷开发 ❌ 不固定,可回退 ⭕ 建模灵活 强调快速交付,建模最小化
原型法 ❌ 反复迭代验证 ⭕ 部分建模 快速做出初版原型,边试边改

先明确什么是分析建模(Analysis Modeling)?

分析建模是软件开发中需求分析阶段的重要组成部分,其核心目的是:

把模糊的用户需求,结构化、形式化地表达出来,为后续设计和实现做好准备。

标准分析建模的四个主要目的

  1. 定义可验证的软件需求(✅)
    → 让开发人员和客户都能理解并确认需求是否明确。

  2. 描述客户需求(✅)
    → 用结构化方式表达“系统应该做什么”,便于交流。

  3. 为设计建立逻辑基础(✅)
    → 分析建模输出的模型是设计阶段输入的依据

  4. 强调系统功能而非实现方式(✅)
    → 分析阶段不解决“怎么做”,而是“做什么”。

开发一个简单的问题解决方案

这是设计阶段或原型阶段的目标,而不是分析建模的目标。

  • 分析建模不提供“解决方案”,它提供“问题的结构化描述”。

  • 它不关心“简单”或“复杂”,也不会直接提出“怎么解决”。

DFD 中的“加工”(Process)是指对数据进行转换、处理的操作,图中用一个圆圈或椭圆表示。

按照数据流图的定义规范:

  • 每个加工必须有:

    • 至少一个输入数据流(即有“数据进来”)

    • 至少一个输出数据流(即有“数据出去”)

✅ 因为加工是对输入数据的处理 → 没有输入就无数据可处理;没有输出就无结果流出

“过程实体”= 软件中独立、可识别、可操作的逻辑过程或功能单元。

比如:

  • 登陆验证功能(一个过程)

  • 商品列表加载(一个过程)

  • 订单提交(另一个过程)

每个功能,都可以抽象为一个过程实体(Process Entity)。它不是“变量”“类”“对象”,而是某个清晰独立的过程动作/功能逻辑块

❓为什么叫“实体”?

是因为我们不止是说“功能”这个抽象概念,而是说“这个功能在系统中要成为一个明确的、单独的、可调度的存在”,就像对象、模块一样——所以叫实体。

抽象(Abstraction)是软件设计的第一步:

它的作用就是:从复杂的现实中,提炼出清晰可控的逻辑单位

比如:

现实中“用户下单”这个行为很复杂,要处理:

  • 用户身份

  • 商品库存

  • 支付接口

  • 收货地址

但我们可以通过抽象,把它整理成几个清晰的过程实体

  1. 检查库存

  2. 校验用户

  3. 创建订单

  4. 发起支付

这些就是“通过抽象得出的过程实体”。

信息隐藏(Information Hiding)就是:每个模块只暴露必要的接口,内部怎么做你别管。

比如:

  • 登录模块提供一个 verifyLogin() 接口

  • 你传入用户名和密码,它返回结果

  • 但你不知道它内部是数据库查?Redis查?有没有日志记录?你都不知道

这就叫信息隐藏。

🔁 好处:

  • 减少模块间耦合

  • 方便后期维护、替换、优化

模块内部有好几个小功能(步骤),它们按顺序执行,而且后面的功能直接吃前面的输出结果当“输入”用

就像接力赛跑,第一棒跑完把接力棒交给第二棒,第二棒才能跑。

内聚类型 中文含义 是否强内聚 举个例子
顺序内聚 输出传给下一个输入 ✅ 中等偏强 表单处理、流水线式数据加工
过程内聚 按顺序执行,但数据无依赖 ⚠ 偏弱 打印、保存、退出一起做,但互不相关
功能内聚 所有操作围绕一个明确目标 ✅ 最强 登录模块、支付模块
偶然内聚(最差) 几个功能硬塞一起,没啥关系 ❌ 最弱 临时写了好几个功能堆一个函数里

通信内聚指:一个模块中各个处理步骤虽然功能不同,但它们都围绕“相同的数据”在操作。

比如:

  • 一个模块负责处理学生成绩,它里面有:

    • 统计总分

    • 统计平均分

    • 找出最高分

虽然是三个不同的小功能,但它们都在处理同一个数据结构(如成绩数组),这就叫通信内聚。

因为这些功能之间的共同点不是任务顺序,也不是功能目标,而是它们都依赖于“同一份信息”,所以也叫信息内聚(Informational Cohesion)。

什么是“功能内聚(Functional Cohesion)”?

是指一个模块里的所有操作、数据、流程,都只为完成一项明确的功能目标而存在,且每一步都是不可或缺的。

举个例子:

  • 登录模块:校验用户名 → 校验密码 → 返回结果
    每一部分都是为了“完成登录”这个目标,且缺一不可。

内聚等级(由弱到强) 特征
偶然 → 逻辑 → 时间 → 顺序 → 通信 → 功能
功能内聚 ✅ 最纯粹、最整洁的单一目标模块

因为:

  • 模块结构清晰

  • 只处理一件事

  • 可测试性、可维护性最好

为什么它“耦合最弱”?

因为它自己就能独立完成一项功能,不依赖其他模块太多内部信息或控制信号,所以与其他模块的连接是最少的、最松的。

耦合越弱,模块之间越独立,改一个不影响另一个,系统更稳定。

在模块内聚(Cohesion)的标准分级中,顺序内聚确实比通信内聚要弱。这不是拍脑袋定的,而是从模块的独立性与关注焦点的集中程度来判断的。

类型 定义说明 内聚强度 为什么强或弱(关键点)
顺序内聚 一个模块中多个功能前后相连,后一步依赖前一步的输出 ✅ 中等 有数据依赖,但每一步的目标不同,仍然偏“串联”
通信内聚 模块内所有功能围绕同一个数据结构进行输入或输出操作,功能彼此平行但相关 ✅ 稍强 虽然功能不同,但关注点统一、数据一致性强

数据库的设计指数据存储文件的设计,主要进行的设计方面有:
概念设计 )、( 逻辑设计 )、( 存储设计

阶段 英文名称 关注点 主要产出 举例
概念设计 Conceptual Design 现实世界中有哪些实体、属性、关系 概念模型(如ER图) 学生、课程、选课三者的联系
逻辑设计 Logical Design 数据库逻辑结构,如何转化为表结构 逻辑模式(如关系模型) 学生表、课程表、选课表,以及字段设计
存储设计 Physical Design 如何在磁盘上高效存储和访问数据 索引、分区、文件结构 给“学生ID”加索引,选择聚簇还是非聚簇

变换型:
输入 → 处理A → 处理B → 处理C → 输出  
(线性)

事务型:
         → 子流程A →  
输入 → 判断 → 子流程B → 输出  
         → 子流程C →
(分支)
 

变换型:一条线;事务型:分支选。
一个是顺序变形流程,一个是按条件选路线

什么是“扇出”和“扇入”?(核心术语)

概念 英文 含义
扇出 Fan-out 一个模块调用的下级模块个数(你派出多少个子任务)
扇入 Fan-in 一个模块被上级模块调用的次数/个数(你被多少人当作工具调用)

📌 它们都是衡量模块结构关系的指标,越合理,结构越清晰、系统越好维护。

  • 顶层模块(像总指挥)负责组织调度,所以扇出高:它要调用很多子模块

  • 中间层模块起到桥梁作用,不要太复杂,所以扇出较低:尽量不要它再派任务

  • 底层模块是“工具模块”,比如“计算平均数”“输出到文件”等,所以扇入高:大家都来用它,它自己不再调别人

         A(顶层,扇出=3)
        / | \
       B  C  D(中层,扇出=1)
       |     |
       E     E(底层,扇入=2)
 

  • 顶层高扇出:利于集中控制、统一分派任务

  • 中层低扇出:避免中间模块过于复杂,降低耦合

  • 底层高扇入:让底层模块复用率高、功能稳定

偶然内聚(Coincidental Cohesion)——最差的一种

  • 定义:模块中各功能毫无关系,只是“碰巧”被放在一起。

  • 特征

    • 功能不相关

    • 可能是写代码时随手加进来的

  • 例子

    一个模块里:
    - 显示欢迎界面
    - 打印用户日志
    - 初始化一个数组
    

    👉 看起来完全是乱搭在一起,根本没有逻辑关系。

  • ❌ 缺点:

    • 难以维护,改一个容易影响无关的地方

    • 不能被复用

逻辑内聚(Logical Cohesion)

  • 定义:模块中有多个功能,它们属于同一类逻辑动作,但具体做哪一个要靠传入的参数来决定

  • 特征

    • 属于“同类任务”,如:输入处理、输出处理、错误处理

    • 通过参数控制执行逻辑

  • 例子

    void handleIO(int mode) {
        if (mode == 0) readFile();
        else if (mode == 1) writeFile();
        else if (mode == 2) deleteFile();
    }
    

    👉 虽然都跟“文件操作”相关,但通过 mode 控制行为。

  • ⚠️ 问题:

    • 参数驱动逻辑,结构不清晰

    • 日后新增功能要频繁改条件判断

时间内聚(Temporal Cohesion)

  • 定义:模块中所有操作必须在相同时间点执行,例如程序启动时或关闭时。

  • 特征

    • 功能有一定时间相关性

    • 通常见于“初始化模块”“退出清理模块”

  • 例子

    系统启动模块:
    - 初始化数据库连接
    - 加载配置文件
    - 清屏

    👉 它们虽然做的事情不同,但都必须在“启动时”发生。

  • ✅ 比前两个好一点,但仍然功能不集中

偶然最差纯拼凑,逻辑靠参选操作,时间同时起步走。

项目 软件结构图(Software Structure Chart, SC 图) 数据图(Data Flow Diagram, DFD)
中文叫法 软件结构图 / 程序结构图 数据流图
核心关注点 模块层级结构调用关系(“怎么做”) 数据处理流程逻辑功能(“做什么”)
表达的是 模块的控制层次、调用顺序、扇入扇出 输入/输出数据流、加工过程、外部实体、存储
使用阶段 结构设计阶段(软件设计中期) 需求分析阶段(软件设计前期)
是否体现数据流动 ❌ 不强调(偏控制流) ✅ 强调数据流转与变换
主要用途 为程序模块划分和代码结构做准备 理解业务流程,定义功能范围

需求分析 → 数据流图(DFD) → 功能模块识别 → 软件结构图(SC图) → 详细设计 → 编码
DFD 是“需求建模工具”,分析业务流程和数据流动

SC 图是“结构设计工具”,组织模块结构和调用层次

👉 数据图帮助我们确定有哪些功能,
👉 结构图帮助我们安排这些功能如何被实现、由谁来做

→ 需求分析(确定“做什么”)
  ↓
→ 概要设计 / 高层设计(模块划分 + 架构图)
  ↓
→ 详细设计(写模块的“内部结构”)
  ↓
→ 编码实现(根据详细设计写代码)
  ↓
→ 测试、部署、维护

✅ 说明:

  • 概要设计/高层设计:重“结构关系”

  • 详细设计/低层设计:重“逻辑实现”

什么是结构图(Structure Chart,SC 图)?

结构图软件结构设计阶段最常用的一种图形工具,用于表示:

模块之间的控制关系与数据传递关系

它是从数据流图(DFD)演化而来,是在“概要设计”中用于指导模块实现的图示。

它重点描述:

  • 系统是由哪些模块构成的(模块划分)

  • 各模块之间是如何调用/控制的(控制关系)

  • 调用时是否有参数/数据传递(数据传递)

题目:结构图中,不是其主要成分的是( C )。

选项 是否主要组成 解释
A. 模块 ✅ 是 每个框框都是一个模块,基本单元
B. 模块间传递的数据 ✅ 是 通常用带箭头的线标注参数传递
C. 模块内部数据 ❌ 否 结构图不画模块内部细节,只画模块之间的关系
D. 模块的控制关系 ✅ 是 用线连接上层模块与下层被调用模块,表示控制关系

结构图中的常见符号

  • 矩形框:表示一个模块

  • 箭头线:表示控制流(调用关系)

  • 空心/实心圆圈、线段注释:表示传递数据、判断点(有时)

结构化设计是一种从数据流图出发,把逻辑功能模块化、层次化的方法。它的核心工具是:

  • 结构图(Structure Chart)

  • 搭配内聚、耦合分析

  • 强调模块化、层次化、信息隐藏

❌ 对比其他选项为何错误:

选项 原因
A. 测试用例设计 属于软件测试阶段,与结构化设计无关
B. 软件概要设计 使用的是结构化分析方法(如 DFD),不是结构化“设计”
C. 程序设计 太宽泛,可能包括编码,不是结构化设计特指的阶段
✅ D. 软件详细设计 ✔ 正确,结构化设计就是这个阶段用的核心方法

特征 顺序内聚(Sequential Cohesion) 过程内聚(Procedural Cohesion)
是否有数据依赖(输入/输出) ✅ 有:一个功能的输出是下一个的输入 ❌ 无:各功能顺序执行但不共享数据
功能之间的逻辑关系 线性传递,像流水线 顺序存在,但无数据耦合,像脚本任务清单
举例 从输入读文件 → 处理数据 → 输出结果 打开文件 → 打印标题 → 关闭文件
内聚强度(相对) ✅ 更强 较弱
图示 A ➝ B ➝ C(A输出→B输入) A; B; C(只是顺序执行)

偶然 < 逻辑 < 时间 < 过程 < 顺序 < 通信 < 功能

结构化设计方法主要用于:
👉 详细设计阶段Low-Level Design

为什么不是“概要设计”阶段?

维度 概要设计(High-Level Design) 详细设计(Low-Level Design)
方法 常用结构化分析方法(Structured Analysis) 使用结构化设计方法(Structured Design)
工具 DFD(数据流图)、数据字典、实体关系图 Structure Chart(结构图)、模块接口表、伪代码
关注点 系统分为哪些大模块、数据如何在模块之间流动 每个模块内部怎么写、控制流程如何安排、数据如何传入传出
抽象程度 比较“粗”,确定功能块和大体结构 更“细”,接近代码实现
输出物 模块划分文档、系统流程图 模块接口文档、结构图、控制流程说明
  • 结构化分析 → 用在概要设计 → 画 DFD

  • 结构化设计 → 用在详细设计 → 画 Structure Chart(结构图)

SP(Structured Programming)结构化程序设计方法,是一种编写清晰、易读、易维护程序的编程规范与思想。它强调:

  • 只使用顺序、选择、循环三种基本控制结构(避免 goto)

  • 程序可以像搭积木一样由这些结构组合构建

  • 每个模块只完成一个功能,并严格限制内部结构

✅ 举个简单例子说明 SP 风格:

void printPositive(int n) {
    if (n > 0) {
        printf("Positive number");
    } else {
        printf("Non-positive number");
    }
}
这个函数没有用到 goto,而是使用选择结构(if-else),就是结构化程序设计的一种体现。

PDL 是用于在详细设计阶段描述模块内部逻辑的“伪代码形式”的结构化语言,帮助程序员将自然语言思路过渡到真正的代码实现。

PDL 的主要用途:

  • 描述一个模块的算法流程

  • 明确模块的输入、输出、控制结构

  • 是从结构化设计过渡到编码的中间过渡文本

  • 人看得懂,但机器不能直接执行

MODULE isPrime
INPUT: integer n
OUTPUT: boolean

BEGIN
    IF n <= 1 THEN
        RETURN false
    FOR i FROM 2 TO sqrt(n) DO
        IF n MOD i = 0 THEN
            RETURN false
    RETURN true
END

你可以看到,它:

  • 用的是伪英语风格的关键字(IF, RETURN, FOR)

  • 不涉及任何具体语言语法(比如没有 C 的 {},也没有 Python 的缩进规则)

  • 逻辑清晰、便于沟通

  • HIPO(Hierarchy plus Input-Process-Output) 是一种结构化文档工具,用于表示模块之间的层次关系与输入输出。

  • PDL(Program Design Language) 是结构化伪码,用于说明模块内部处理逻辑。

这两个都是详细设计阶段常用的规格说明手段

  • 结构化设计(Structured Design) 是详细设计阶段的核心方法,强调模块化、层次化、信息隐藏、内聚与耦合控制。

  • 它配合结构图、PDL、模块说明等工具,详细描述每个模块的功能与接口。

PDL 并不是代码注释,而是设计阶段使用的伪代码说明语言,它通常作为设计文档的一部分存在,而不是直接嵌入代码中当注释使用
而且,即便某些公司允许在注释中嵌入 PDL 描述,也不是 PDL 的标准定义内容,因此这个说法不准确。

流程图并不强调“从抽象到具体”的逐步求精过程,反而常常直接给出完整实现逻辑,不具备分层递进的表达能力。这正是 PAD 图胜过流程图的地方。

需求分析 → 概要设计 → ✅ 详细设计 → 编码 → 测试 → 运维
                         ↑
              这一步中使用详细设计工具

工具名称 作用 是否图形化
PDL(程序设计语言) 用“伪代码”描述模块内部逻辑,接近真实程序结构 否(文字描述)
PAD 图(Problem Analysis Diagram) 顺序/选择/循环块表示流程,强调结构清晰 ✅ 是
流程图(Flowchart) 展示操作的顺序、分支与循环,容易直观表现控制逻辑 ✅ 是
Nassi-Shneiderman 图 结构化流程图,每个控制结构一个矩形块,强制结构化 ✅ 是
IPO 图(输入-处理-输出) 描述模块的数据输入、处理过程和输出结果 ✅ 是
模块接口说明表 列清楚每个模块的参数、输入输出、调用方式 否(表格描述)
设计问题 详细设计工具如何帮助解决
模块怎么实现? 用 PDL 或 PAD 图明确每一步的处理逻辑
数据从哪里来,怎么处理? 用 IPO 图来分析输入 → 处理 → 输出关系
模块内部的控制逻辑是否清晰? 用 PAD、流程图或 Nassi 图结构化呈现
是否容易转化为代码? PDL 是写代码前的“半成品”逻辑框架
对比维度 Jackson 方法(JSP) PAD 图(结构化图)
所属阶段 软件详细设计(过程设计) 软件详细设计(过程设计)
表达方式 以“输入数据结构”为出发点,展开控制结构 以“控制结构三要素”为核心(顺序/选择/循环)
核心思想 程序结构应映射输入数据结构 控制逻辑结构化(结构程序设计三结构)
应用场景 文件处理、数据顺序结构强的问题 任何通用的程序模块逻辑设计
是否图形化 是,有自己的“Jackson 图” 是,使用专门的 PAD 图格式
是否强调结构化 ✅ 强调结构化程序控制流程 ✅ 强调结构化三结构原则


✅ 结论:

  • 你可以理解为:Jackson 方法和 PAD 是“达到模块内部结构清晰”的两种不同技术路线。

  • 就像画图时有铅笔素描法和水彩法,目的都是“表现结构”,但用法和偏好不同。

  • 在实际使用中,不同开发组织可能选用其中之一或混合使用。

An excellent course, yet regrettably one that rarely finds its place beyond academia.