# 软件设计方法

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u12-software-design-methods/

本模块讲解CIE A-Level计算机科学的两种核心软件设计方法：结构化（过程式）设计和面向对象设计（OOD）。你将学习它们的关键特征、优点，以及考试场景中的适用用例。

**先修:** [软件开发生命周期基础](https://www.owlsprep.com/zh/study/cie-9618-u12-software-development-life-cycle/); 基础编程概念（模块、函数）

## 学习目标

- 比较和对比结构化与面向对象软件设计方法
- 识别每种方法的关键特征和核心原则
- 针对给定软件场景论证设计方法选择的合理性
- 应用每种方法分解简单系统

## 结构化（过程式）软件设计

**结构化设计** — 一种自顶向下的软件设计方法，将系统分解为更小的分层功能模块，重点关注作用于独立数据的过程和流程。

*记法:* 也称为过程式设计

*例:* 工资程序被分解为输入、税额计算、报表生成和输出模块。

结构化设计围绕关注点分离原则构建，系统按功能而非数据拆分。使用的核心技术是自顶向下分解（也称为逐步求精），将整体问题拆分为更小的子问题，每个子问题单独解决。

- 结构化设计的关键特征：
- 分解为具有清晰层级结构的功能模块
- 数据与作用于数据的过程相互分离
- 使用流程图和结构图可视化设计
- 促进单个函数的复用

**例题:** 使用结构化设计原则分解一个简单的ATM取款系统。

1. 步骤1：从整体顶层功能开始：*完成ATM取款*
2. 步骤2：将顶层功能分解为3个核心子功能：1. 验证用户卡片和PIN 2. 处理取款请求 3. 出钞并更新余额
3. 步骤3：进一步分解最大的子功能*处理取款请求*，得到更小的子功能：1. 检查可用账户余额 2. 与用户确认取款金额 3. 更新内部系统余额 4. 生成交易收据
4. 结果：得到层级化的函数结构，每个函数负责一个明确任务，数据（例如用户余额）与使用该数据的函数分开存储。

> **考试提示:** 考官经常要求你描述系统的结构化分解。记住模块是按功能分组，而不是按数据实体分组。

## 面向对象软件设计（OOD）

**面向对象设计** — 一种将系统建模为一组相互交互的对象集合的软件设计方法，每个对象都结合了数据（属性）和作用于该数据的过程（方法）。

*例:* ATM系统会有`User`、`Card`、`Account`和`ATM`这类对象。

面向对象设计直接对问题域中的真实实体或抽象概念建模。CIE 9618考试考察的面向对象设计核心原则如下：

- **封装**：对象隐藏其内部数据，仅通过方法暴露受控访问
- **继承**：新类可以从现有类继承属性和方法，减少代码重复
- **多态**：不同类型的对象可以对同一方法调用做出不同响应

**例题:** 使用面向对象设计原则识别ATM取款系统的核心类及其组成。

1. 步骤1：识别问题域中的关键真实实体（名词）：`ATM`、`Card`、`BankAccount`、`Transaction`、`User`
2. 步骤2：为每个类定义属性（数据）。例如，`BankAccount`类的属性为：`accountNumber`、`balance`、`accountHolderName`
3. 步骤3：定义作用于类属性的方法（行为）。对于`BankAccount`类：`getBalance()`、`withdraw(amount)`、`deposit(amount)`
4. 步骤4：定义类之间的关系。例如，一个`User`拥有一个或多个`BankAccount`，`ATM`与`Card`对象交互以验证用户身份。
5. 结果：每个类都结合了数据和相关行为，而非像结构化设计那样将二者分离。

> **考试提示:** 当要求列出面向对象设计的特征时，一定要提到数据和方法被封装在一起。这是一个常见的得分点。

## 方法比较与选择正确方法

考试经常要求你比较两种方法，并论证针对给定场景应使用哪一种。下表总结了关键区别：

| 方面 | 结构化设计 | 面向对象设计 |
| --- | --- | --- |
| 组织方式 | 功能/流程 | 对象/实体 |
| 数据与行为 | 数据与过程分离 | 数据+方法封装在一起 |
| 最适用场景 | 需求固定的小型简单系统 | 需求不断演化的大型复杂系统 |
| 复用性 | 仅支持函数级复用 | 通过继承实现高复用性 |
| 修改难度 | 大型系统难以修改 | 易于修改，对全系统影响有限 |
| 维护成本 | 大型系统成本更高 | 大型演化系统成本更低 |

**考试命令词**

对于CIE 9618，本主题常见命令术语的评分要求如下：

- **Compare** — 给出两种方法之间的相同点和不同点 *(比较结构化设计和面向对象设计（通常6-8分）)*

- **Justify** — 说明你选择的方法，然后给出将其特征与场景需求关联的理由 *(论证你为大型电商系统选择设计方法的合理性（通常4分）)*

- **State features** — 按要求数量列出关键特征，除非题目要求否则无需额外解释 *(说出面向对象设计的三个特征（通常3分）)*

**概念自测**

检查你对核心区别的理解：

1. 哪种设计方法将数据与作用于数据的过程分离？

   - 结构化设计
   - 面向对象设计

   *答案:* 结构化设计

   *解析:* 正确！结构化设计将数据与函数分离，而面向对象设计将二者封装在对象中。

2. 哪种设计方法更适合需要定期更新的大型系统？

   - 结构化设计
   - 面向对象设计

   *答案:* 面向对象设计

   *解析:* 正确！由于封装和模块化，面向对象设计更易于维护大型、不断演化的系统。

## 常见错误

- **错误做法:** 将自顶向下分解等同于整个结构化设计
  - 原因: 自顶向下分解只是结构化设计中使用的一项技术，并非整个方法。
  - 正确做法: 描述结构化设计时，要说明它使用自顶向下分解，加上模块化、数据与函数分离等其他关键特征。
- **错误做法:** 声称面向对象设计在所有问题上都优于结构化设计
  - 原因: 考官希望你根据场景匹配方法，而非说明某一种方法普遍更优。
  - 正确做法: 将你的选择与场景的规模和需求关联：小型静态系统用结构化设计，大型演化系统用面向对象设计。
- **错误做法:** 将封装描述为仅结合数据和方法，省略了数据隐藏
  - 原因: 大多数评分标准要求封装的数据隐藏部分才能给满分。
  - 正确做法: 一定要说明封装会隐藏内部数据，仅通过方法暴露受控访问。
- **错误做法:** 设计面向对象系统时，将函数列为类
  - 原因: 这混淆了结构化设计和面向对象设计的组织方式，导致设计错误。
  - 正确做法: 在面向对象设计中，类代表问题域中的名词（实体/概念），方法是动词（动作）。
- **错误做法:** 声称结构化设计不使用模块化
  - 原因: 一个常见误区：只有面向对象设计是模块化的。两种方法都是模块化的。
  - 正确做法: 记住区别在于模块的基础：结构化的模块是函数，面向对象的模块是类/对象。

## 速查表

| 特征 | 结构化设计 | 面向对象设计 |
| --- | --- | --- |
| 核心组织方式 | 按功能/流程 | 按对象/实体 |
| 数据与行为 | 数据与过程分离 | 数据+方法封装 |
| 核心技术 | 自顶向下分解、结构图 | 类图、用例建模 |
| 最适用场景 | 小型、静态系统 | 大型、演化系统 |
| 核心优势 | 简单易学易实现 | 易于维护、复用性高 |
| 核心劣势 | 大型系统难以修改 | 学习曲线更陡 |

## 下一步

理解软件设计方法是CIE 9618中所有其他软件开发主题的基础技能。考官经常将本主题与软件开发生命周期、UML建模、软件维护的问题结合考察，因此扎实的理解将帮助你在考试多个部分得分。设计方法的选择直接影响从实现到长期维护的整个开发生命周期，因此能够针对任意场景比较和论证方法选择至关重要。

- [测试](https://www.owlsprep.com/zh/study/cie-9618-u12-testing/)
- [调试](https://www.owlsprep.com/zh/study/cie-9618-u12-debugging/)
- [软件维护](https://www.owlsprep.com/zh/study/cie-9618-u12-software-maintenance/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u12-software-design-methods/
