软件设计方法
计算机科学· 第12单元:软件开发,主题3· 15 分钟阅读
1. 结构化(过程式)软件设计★★☆☆☆⏱ 5 min
结构化设计
一种自顶向下的软件设计方法,将系统分解为更小的分层功能模块,重点关注作用于独立数据的过程和流程。
例:
工资程序被分解为输入、税额计算、报表生成和输出模块。
结构化设计围绕关注点分离原则构建,系统按功能而非数据拆分。使用的核心技术是自顶向下分解(也称为逐步求精),将整体问题拆分为更小的子问题,每个子问题单独解决。
结构化设计的关键特征:
分解为具有清晰层级结构的功能模块
数据与作用于数据的过程相互分离
使用流程图和结构图可视化设计
促进单个函数的复用
使用结构化设计原则分解一个简单的ATM取款系统。
- 1
步骤1:从整体顶层功能开始:完成ATM取款
- 2
步骤2:将顶层功能分解为3个核心子功能:1. 验证用户卡片和PIN 2. 处理取款请求 3. 出钞并更新余额
- 3
步骤3:进一步分解最大的子功能处理取款请求,得到更小的子功能:1. 检查可用账户余额 2. 与用户确认取款金额 3. 更新内部系统余额 4. 生成交易收据
- 4
结果:得到层级化的函数结构,每个函数负责一个明确任务,数据(例如用户余额)与使用该数据的函数分开存储。
Exam tip:
考官经常要求你描述系统的结构化分解。记住模块是按功能分组,而不是按数据实体分组。
2. 面向对象软件设计(OOD)★★★☆☆⏱ 6 min
面向对象设计
一种将系统建模为一组相互交互的对象集合的软件设计方法,每个对象都结合了数据(属性)和作用于该数据的过程(方法)。
例:
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
结果:每个类都结合了数据和相关行为,而非像结构化设计那样将二者分离。
Exam tip:
当要求列出面向对象设计的特征时,一定要提到数据和方法被封装在一起。这是一个常见的得分点。
3. 方法比较与选择正确方法★★★☆☆⏱ 4 min
考试经常要求你比较两种方法,并论证针对给定场景应使用哪一种。下表总结了关键区别:
方面 | 结构化设计 | 面向对象设计 |
|---|---|---|
组织方式 | 功能/流程 | 对象/实体 |
数据与行为 | 数据与过程分离 | 数据+方法封装在一起 |
最适用场景 | 需求固定的小型简单系统 | 需求不断演化的大型复杂系统 |
复用性 | 仅支持函数级复用 | 通过继承实现高复用性 |
修改难度 | 大型系统难以修改 | 易于修改,对全系统影响有限 |
维护成本 | 大型系统成本更高 | 大型演化系统成本更低 |
检查你对核心区别的理解:
哪种设计方法将数据与作用于数据的过程分离?
结构化设计
面向对象设计
哪种设计方法更适合需要定期更新的大型系统?
结构化设计
面向对象设计
显示答案
1 —正确!由于封装和模块化,面向对象设计更易于维护大型、不断演化的系统。
4. 常见陷阱
错误做法:
将自顶向下分解等同于整个结构化设计
原因:
自顶向下分解只是结构化设计中使用的一项技术,并非整个方法。
正确做法:
描述结构化设计时,要说明它使用自顶向下分解,加上模块化、数据与函数分离等其他关键特征。
错误做法:
声称面向对象设计在所有问题上都优于结构化设计
原因:
考官希望你根据场景匹配方法,而非说明某一种方法普遍更优。
正确做法:
将你的选择与场景的规模和需求关联:小型静态系统用结构化设计,大型演化系统用面向对象设计。
错误做法:
将封装描述为仅结合数据和方法,省略了数据隐藏
原因:
大多数评分标准要求封装的数据隐藏部分才能给满分。
正确做法:
一定要说明封装会隐藏内部数据,仅通过方法暴露受控访问。
错误做法:
设计面向对象系统时,将函数列为类
原因:
这混淆了结构化设计和面向对象设计的组织方式,导致设计错误。
正确做法:
在面向对象设计中,类代表问题域中的名词(实体/概念),方法是动词(动作)。
错误做法:
声称结构化设计不使用模块化
原因:
一个常见误区:只有面向对象设计是模块化的。两种方法都是模块化的。
正确做法:
记住区别在于模块的基础:结构化的模块是函数,面向对象的模块是类/对象。
5. 速查表
特征 | 结构化设计 | 面向对象设计 |
|---|---|---|
核心组织方式 | 按功能/流程 | 按对象/实体 |
数据与行为 | 数据与过程分离 | 数据+方法封装 |
核心技术 | 自顶向下分解、结构图 | 类图、用例建模 |
最适用场景 | 小型、静态系统 | 大型、演化系统 |
核心优势 | 简单易学易实现 | 易于维护、复用性高 |
核心劣势 | 大型系统难以修改 | 学习曲线更陡 |
6. 常见问题
考试中我需要记住两种方法的所有特征吗?
需要。考试题目经常要求列出特征、比较方法,并针对给定场景论证选择合理性。你应该能够说出每种方法至少3个关键特征。
自顶向下设计和结构化设计的区别是什么?
自顶向下分解是结构化设计中使用的核心技术。结构化设计作为完整方法,包含自顶向下分解、模块化,以及数据与过程分离。
真题中的出现
AI 根据考纲规律估算的考点位置,请对照官方真题核实准确性。仅作复习重点参考。
- 2022 · 12
比较面向对象设计与结构化设计
- 2023 · 11
陈述面向对象设计的特征
- 2024 · 12
论证设计方法选择的合理性
深入阅读
下一步
理解软件设计方法是CIE 9618中所有其他软件开发主题的基础技能。考官经常将本主题与软件开发生命周期、UML建模、软件维护的问题结合考察,因此扎实的理解将帮助你在考试多个部分得分。设计方法的选择直接影响从实现到长期维护的整个开发生命周期,因此能够针对任意场景比较和论证方法选择至关重要。
