7.2 软件开发方法
本课核心知识点整理
方法和模型不是一回事
软件开发方法回答“用什么思想分析和组织问题”,软件开发模型回答“按什么过程推进项目”。例如结构化方法是一种面向过程、逐步分解的分析设计思想;瀑布模型是一种阶段顺序明确的过程模型。二者相关,但不能完全等同。
| 维度 | 关注问题 | 例子 |
|---|---|---|
| 开发方法 | 怎样理解问题、分解系统、组织设计 | 结构化方法、原型方法、面向对象方法 |
| 开发模型 | 生命周期活动按什么顺序、粒度和反馈方式执行 | 瀑布、V 模型、增量、螺旋、敏捷 |
课堂提到这一节考试频率不算特别高,但它是全局性概念,尤其要能区分结构化、原型和面向对象。
结构化方法:面向过程,自顶向下
结构化方法是较早期的软件开发方法,它的基本思想是:先理解问题的处理过程,再把解决方案一步一步分解和实现。
| 特征 | 含义 |
|---|---|
| 面向过程 | 关注处理步骤、数据流动和功能分解 |
| 用户至上 | 以用户需求和业务处理为出发点 |
| 自顶向下 | 从整体功能逐层分解到子功能和模块 |
| 逐步求精 | 每次分解都让问题更具体、更可实现 |
| 阶段清晰 | 规划、需求、设计、实现、测试、维护等阶段边界明确 |
| 文档驱动 | 各阶段形成计划书、需求规格说明书、设计说明书、测试报告等 |
结构化方法很适合需求较稳定、业务流程清晰、系统边界明确的项目。
结构化方法的典型产物链
| 阶段 | 产物 |
|---|---|
| 规划/计划 | 项目计划书 |
| 需求分析 | 需求规格说明书 |
| 概要设计 | 概要设计说明书 |
| 详细设计 | 详细设计说明书 |
| 实现/编码 | 源码文件 |
| 测试 | 测试计划、测试用例、测试报告 |
| 运维 | 维护记录、变更记录 |
这个产物链说明结构化方法强调可追踪和可管理,但也意味着它对需求变更的响应相对不够灵活。
原型方法:先做出来给用户看
原型方法适合需求不清或用户难以准确表达需求的场景。它先构造一个可演示、可试用的原型,通过用户反馈逐步澄清需求。
| 优点 | 局限 |
|---|---|
| 用户更容易理解和反馈 | 原型可能被误认为最终系统 |
| 有助于发现遗漏需求 | 如果管理不好,容易边改边做失控 |
| 降低需求理解偏差 | 需要区分抛弃型原型和演化型原型 |
为什么原型方法会出现?因为严格线性方法要求用户一开始说清所有需求,而现实中很多用户只有看到界面和交互后才知道自己真正想要什么。
面向对象方法:把数据和行为组织为对象
面向对象方法以对象为中心,把数据和操作封装在对象内部,通过类、继承、多态、消息等机制组织系统。
| 结构化方法 | 面向对象方法 |
|---|---|
| 偏功能分解和处理过程 | 偏对象、职责和协作 |
| 数据和处理过程容易分离 | 数据和行为封装在对象中 |
| 适合流程稳定、功能清晰的系统 | 适合复杂领域建模和可复用设计 |
| 常用数据流图、结构图 | 常用用例图、类图、顺序图 |
面向对象方法不是简单“换一种画图方式”,它改变了系统分解的中心:从“系统要执行哪些步骤”转向“系统中有哪些对象,它们各自承担什么职责并如何协作”。
技术迭代:为什么从结构化走向面向对象和敏捷
| 方法 | 优势 | 局限 | 后续方法补了什么 |
|---|---|---|---|
| 结构化方法 | 纪律性强、阶段清晰、文档完整 | 对需求变化响应慢,数据与过程分离导致维护困难 | 原型加强需求反馈,面向对象加强封装和复用 |
| 原型方法 | 快速澄清需求,降低沟通偏差 | 容易失控,原型质量和范围难管理 | 迭代模型、敏捷方法进一步强调节奏和反馈 |
| 面向对象方法 | 封装、复用、可扩展性更好 | 建模门槛较高,设计不当会过度抽象 | 敏捷实践强调持续交付和重构 |
例题
强调面向过程、自顶向下、逐步求精的软件开发方法是:
原型方法更适合:
面向对象方法的关键词是:
自查要点
- 开发方法和开发模型有什么区别?
- 结构化方法为什么说是面向过程?
- 原型方法为什么能缓解需求不清的问题?
- 面向对象方法相对结构化方法改进了什么?
- 为什么后续敏捷方法会强调迭代反馈?