学习指南

软件设计方法

计算机科学· 第12单元:软件开发,主题3· 15 分钟阅读

1. 结构化(过程式)软件设计★★☆☆☆⏱ 5 min

📘 定义

结构化设计

也称为过程式设计也称为过程式设计

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

例:

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

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

  • 结构化设计的关键特征:

  • 分解为具有清晰层级结构的功能模块

  • 数据与作用于数据的过程相互分离

  • 使用流程图和结构图可视化设计

  • 促进单个函数的复用

📐 例题

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

  1. 1

    步骤1:从整体顶层功能开始:完成ATM取款

  2. 2

    步骤2:将顶层功能分解为3个核心子功能:1. 验证用户卡片和PIN 2. 处理取款请求 3. 出钞并更新余额

  3. 3

    步骤3:进一步分解最大的子功能处理取款请求,得到更小的子功能:1. 检查可用账户余额 2. 与用户确认取款金额 3. 更新内部系统余额 4. 生成交易收据

  4. 4

    结果:得到层级化的函数结构,每个函数负责一个明确任务,数据(例如用户余额)与使用该数据的函数分开存储。

Exam tip:

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

2. 面向对象软件设计(OOD)★★★☆☆⏱ 6 min

📘 定义

面向对象设计

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

例:

ATM系统会有UserCardAccountATM这类对象。

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

  • 封装:对象隐藏其内部数据,仅通过方法暴露受控访问

  • 继承:新类可以从现有类继承属性和方法,减少代码重复

  • 多态:不同类型的对象可以对同一方法调用做出不同响应

📐 例题

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

  1. 1

    步骤1:识别问题域中的关键真实实体(名词):ATMCardBankAccountTransactionUser

  2. 2

    步骤2:为每个类定义属性(数据)。例如,BankAccount类的属性为:accountNumberbalanceaccountHolderName

  3. 3

    步骤3:定义作用于类属性的方法(行为)。对于BankAccount类:getBalance()withdraw(amount)deposit(amount)

  4. 4

    步骤4:定义类之间的关系。例如,一个User拥有一个或多个BankAccountATMCard对象交互以验证用户身份。

  5. 5

    结果:每个类都结合了数据和相关行为,而非像结构化设计那样将二者分离。

Exam tip:

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

3. 方法比较与选择正确方法★★★☆☆⏱ 4 min

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

方面

结构化设计

面向对象设计

组织方式

功能/流程

对象/实体

数据与行为

数据与过程分离

数据+方法封装在一起

最适用场景

需求固定的小型简单系统

需求不断演化的大型复杂系统

复用性

仅支持函数级复用

通过继承实现高复用性

修改难度

大型系统难以修改

易于修改,对全系统影响有限

维护成本

大型系统成本更高

大型演化系统成本更低

✓ 快速检测

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

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

    • 结构化设计

    • 面向对象设计

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

    • 结构化设计

    • 面向对象设计

    显示答案
    1

    正确!由于封装和模块化,面向对象设计更易于维护大型、不断演化的系统。

4. 常见陷阱

错误做法:

将自顶向下分解等同于整个结构化设计

原因:

自顶向下分解只是结构化设计中使用的一项技术,并非整个方法。

正确做法:

描述结构化设计时,要说明它使用自顶向下分解,加上模块化、数据与函数分离等其他关键特征。

错误做法:

声称面向对象设计在所有问题上都优于结构化设计

原因:

考官希望你根据场景匹配方法,而非说明某一种方法普遍更优。

正确做法:

将你的选择与场景的规模和需求关联:小型静态系统用结构化设计,大型演化系统用面向对象设计。

错误做法:

将封装描述为仅结合数据和方法,省略了数据隐藏

原因:

大多数评分标准要求封装的数据隐藏部分才能给满分。

正确做法:

一定要说明封装会隐藏内部数据,仅通过方法暴露受控访问。

错误做法:

设计面向对象系统时,将函数列为类

原因:

这混淆了结构化设计和面向对象设计的组织方式,导致设计错误。

正确做法:

在面向对象设计中,类代表问题域中的名词(实体/概念),方法是动词(动作)。

错误做法:

声称结构化设计不使用模块化

原因:

一个常见误区:只有面向对象设计是模块化的。两种方法都是模块化的。

正确做法:

记住区别在于模块的基础:结构化的模块是函数,面向对象的模块是类/对象。

5. 速查表

特征

结构化设计

面向对象设计

核心组织方式

按功能/流程

按对象/实体

数据与行为

数据与过程分离

数据+方法封装

核心技术

自顶向下分解、结构图

类图、用例建模

最适用场景

小型、静态系统

大型、演化系统

核心优势

简单易学易实现

易于维护、复用性高

核心劣势

大型系统难以修改

学习曲线更陡

6. 常见问题

考试中我需要记住两种方法的所有特征吗?

需要。考试题目经常要求列出特征、比较方法,并针对给定场景论证选择合理性。你应该能够说出每种方法至少3个关键特征。

自顶向下设计和结构化设计的区别是什么?

自顶向下分解是结构化设计中使用的核心技术。结构化设计作为完整方法,包含自顶向下分解、模块化,以及数据与过程分离。

真题中的出现

AI 根据考纲规律估算的考点位置,请对照官方真题核实准确性。仅作复习重点参考。

  • 2022 · 12

    比较面向对象设计与结构化设计

  • 2023 · 11

    陈述面向对象设计的特征

  • 2024 · 12

    论证设计方法选择的合理性

深入阅读

下一步

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