软件开发中结构化方法与面向对象方法在软件生命周期中的对应关系
近来在学习软件工程理论中,涉及到了软件生命周期,以及结构化方法,面向对象方法等概念。它触及了软件工程中经典理论(通用生命周期)与方法论(具体开发方法)之间的关系。
软件生命周期
软件生命周期包含可行性分析与项目开发计划,需求分析,设计(概要设计,详细设计),编码,测试,运行与维护。
简单来说:软件生命周期阶段描述的是"要做什么"(What),而面向对象方法或结构化方法描述的是"如何去做"(How)。它们不是互斥的,而是相辅相成的。可以将面向对象或结构化的分析、设计、编码、测试等活动,填充到软件生命周期的各个阶段中。软件生命周期是软件项目的「行程总规划」,规定了从起点到终点的大站点;结构化方法、面向对象方法是两套不同的「驾驶技术」,其「分析、设计、编码、测试」是驾驶过程中每个站点内的具体操作步骤,无论用哪种驾驶技术,都必须沿着总规划的路线行驶。
可行性分析与项目开发计划
这个阶段是方法论中立的。无论是采用面向对象还是结构化方法,在项目启动前,都需要进行商业、技术、法律等方面的可行性研究,并制定初步的计划。方法的选择(选用面向对象还是结构化)本身可能就是本阶段的一个技术可行性决策。
需求分析阶段
这个阶段的目标是搞清楚"系统必须做什么"。明确用户的业务需求、功能需求、非功能需求,输出《需求规格说明书》。
-
面向对象方法 :
面向对象方法在该阶段对应 面向对象分析(OOA - Object-Oriented Analysis)
- 如何做:以「对象」为中心,梳理业务中的实体、属性、行为、交互关系,抽象出核心业务对象,明确对象间的消息传递。通过识别系统与外部交互者(参与者/Actor)和系统应提供的服务(用例/Use Case)来建立功能模型(用例图、用例描述)。同时,识别问题域中的关键对象(实体类)、它们的属性、行为以及对象间的关系(初始的类图)。也可能绘制活动图来描述业务流程。
- 对应产出:用例模型、初始类图、术语表等,这些内容构成了需求规格说明的核心部分。
-
结构化方法:
结构化方法在该阶段对应 结构化分析(SA - Structured Analysis)
- 如何做:以「功能/数据流」为中心,梳理系统的输入→处理→输出流程,拆解业务功能,明确每个功能的逻辑关系。聚焦于数据的流动和处理。通过 数据流图[DFD] 来描绘数据从输入到输出所经历的加工过程。同时,使用 [数据字典] 定义数据,用实体关系图ER图 描述数据存储的逻辑结构,用 状态转换图 描述系统状态变化。
- 对应产出:一套完整的数据流图、数据字典、ER图等,这些文档构成了需求规格说明。
系统设计阶段
这个阶段的目标是规划"系统如何做"。基于需求分析结果,它关注系统的架构、模块、接口和数据。分为 2 个子阶段:
① 概要设计:搭建系统整体架构、划分模块 / 子系统、确定接口;
② 详细设计:设计模块内部的算法、数据结构、流程,细化到可编码。
-
面向对象方法:
面向对象方法在该阶段对应 面向对象设计 (OOD - Object-Oriented Design)
- 概要设计:定义系统的体系结构,如分层架构(UI层、业务逻辑层、数据访问层)、包/命名空间的划分、确定关键的技术框架和设计模式。设计系统与子系统的交互。划分系统架构层(表现层、业务层、数据层),完善类的继承体系、接口设计,确定对象间的协作模式,输出架构设计文档;
- 详细设计:对OOA中产生的类进行精化。详细设计类的属性、方法签名、参数、返回值。使用类图 详细描述类之间的关系(继承、关联、聚合、组合、依赖),使用时序图 或协作图 描述对象之间完成特定功能时的动态交互,设计数据库表结构 (可能从类图映射)。细化类的属性 / 方法、设计方法的具体逻辑、定义对象的交互细节(时序图、协作图),输出详细设计文档。
- 核心思想:以类和对象为中心,进行迭代精化。
-
结构化方法:
结构化方法在该阶段对应 结构化设计 (SD - Structured Design)
- 概要设计:将DFD图映射为系统结构图 (或称模块结构图/SC图)。基于 SA 的 DFD,遵循"高内聚、低耦合"的原则划分功能模块,设计模块间的调用关系、接口,输出《概要设计说明书》;
- 详细设计:为SC图中的每一个模块编写模块说明书。描述其功能、接口(输入、输出)、采用的算法(伪代码或流程图)和局部数据结构。为每个功能模块设计具体的算法、流程(程序流程图、N-S 图)、数据结构,输出《详细设计说明书》,直接指导编码。
- 核心思想:以功能模块为中心,进行自上而下的层次分解。
软件开发阶段
这个阶段就是将设计转化为实际的代码。
-
面向对象方法:
面向对象方法在该阶段对应 面向对象编程 (OOP)
使用Java、C++、C#、Python等OO语言,实现OOD中定义的类、接口、关联和设计模式。编码单位是"类"。遵循 OOD 的类与对象设计,实现类的封装、继承、多态,通过对象的实例化与消息传递完成业务功能,强调代码的复用性、可扩展性。
-
结构化方法:
结构化方法在该阶段对应 结构化编程 (SP)
使用C、Pascal等过程式语言,或者使用OO语言但按过程式思想(主要编写函数/过程),实现SD中定义的模块和算法。编码单位是"函数/过程"和"数据结构"。用「顺序、选择、循环」3 种基本结构实现模块功能,强调代码的模块化、过程化,一个模块对应一个功能。
软件测试阶段
测试阶段的目标是发现缺陷,验证软件是否符合需求和设计。
- 面向对象测试:以「类 / 对象 / 接口」为测试单元,除了常规的功能测试,还需重点测试类的封装性、继承的正确性、多态的适配性、对象交互的完整性,兼顾功能与结构的合理性,更适配复杂系统。
- 单元测试:以类为单元,测试其方法。由于继承和多态,测试更复杂(需考虑子类、动态绑定)。
- 集成测试:侧重于对象间的交互和组件(如一组协作的类)的集成,常使用基于用例的测试或基于交互图的测试。
- 系统测试 & 验收测试:与结构化方法类似,都是黑盒测试,基于需求规格(如用例)进行。
- 结构化测试:以「功能 / 模块」为测试单元,基于结构化设计的模块划分,先做单元测试(验证单个功能模块),再做集成测试(验证模块间调用),最后做系统测试(验证整体功能),侧重流程与功能的正确性。
- 单元测试:以模块(函数/过程)为单元,测试其内部逻辑(常用白盒测试方法如路径覆盖)。
- 集成测试:采用自顶向下或自底向上的策略,将模块按结构图逐步组装起来进行测试。
- 系统测试 & 验收测试:基于需求规格进行,验证整个系统的功能和非功能需求。
运行维护阶段
维护活动包括修正错误、改进性能、适应新环境、增加新功能等。
- 面向对象方法:由于封装、继承和多态,理论上更易于维护和扩展。修改一个类的内容,只要接口不变,影响范围可能较小。添加新功能可能通过增加新类或扩展现有类来实现。
- 结构化方法:维护往往更困难。修改一个数据结构或一个关键函数,可能会产生"涟漪效应",波及许多相关模块。维护文档(如DFD、SC图)的更新至关重要。
总结与核心差异
| 软件生命周期阶段 | 面向对象方法的"如何做" | 结构化方法的"如何做" |
|---|---|---|
| 需求分析 | 建立用例模型和领域对象模型(找名词/动词) | 建立数据流模型和数据模型(找数据/加工) |
| 系统设计 | 精化对象模型,设计类体系结构和对象交互 | 将数据流图转化为模块结构图,设计模块算法 |
| 软件开发 | 实现类和对象之间的协作 | 实现函数/过程和数据结构 |
| 软件测试 | 以类/对象为单元,关注交互 | 以模块/函数为单元,关注接口和控制流 |
根本区别在于思维范式:
- 结构化方法:采用分解的视角,将大系统分解为功能模块(过程/函数),数据与处理数据的函数是分离的。核心是"过程"和"数据流"。
- 面向对象方法:采用抽象和封装的视角,将系统看作一系列相互作用的对象,每个对象封装了数据和操作该数据的方法。核心是"对象"和"消息传递"。
现代的软件开发(尤其是复杂业务系统)普遍采用面向对象方法,因为它更贴近人类对现实世界的认知,能更好地应对变化。但结构化思想(如模块化、分层)依然是软件架构设计的重要基础。很多时候,两者在实践中是融合使用的。
愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!