【软考架构】需求工程中,系统分析与设计的结构化方法
结构化方法诞生于20世纪70年代,是为了应对当时日益复杂的软件系统开发挑战(如“软件危机”)而提出的。它强调系统性、规范性、分解和抽象,目标是提高软件开发的效率、质量和可维护性,降低复杂性。
核心思想:
- 自顶向下,逐步求精: 从系统最宏观、最抽象的整体视图开始,逐步分解成更小、更具体、更容易理解和实现的模块或过程。
- 功能分解: 将复杂的系统视为一系列功能的集合。分析的核心是理解“系统做什么”,设计则是将这些功能分解、组织并分配到具体的模块中。
- 数据与功能分离: 明确区分系统中的数据(是什么)和功能/过程(对数据做什么)。数据通常用数据模型(如ER图)描述,功能用过程模型(如数据流图)描述。
- 模块化: 系统被分解成一组相对独立、高内聚、低耦合的模块。每个模块负责一个明确定义的功能子集。
- 使用图形化建模工具: 大量使用标准化的图表(如数据流图、结构图、实体关系图、状态转换图等)来可视化地描述系统的不同方面(功能、数据、状态),取代或补充大量的文字描述,提高沟通效率和清晰度。
- 形式化或半形式化的规范: 强调使用清晰、无歧义、相对标准的符号和规则来描述需求和设计。
- 关注逻辑模型与物理模型:
- 逻辑模型: 描述系统“做什么”,独立于具体的技术实现(如硬件、软件平台、数据库管理系统)。这是分析和需求规格说明阶段的核心产出。
- 物理模型: 描述系统“如何实现”,即逻辑模型在特定技术环境下的具体实现方案。这是设计阶段的核心产出。
结构化方法的核心阶段与技术:
结构化方法通常贯穿整个系统开发生命周期(SDLC),尤其是在分析(SA - Structured Analysis)和设计(SD - Structured Design)阶段最为突出。
-
结构化分析:
- 目标: 理解用户需求,定义系统“做什么”,建立系统的逻辑模型。
- 主要技术与工具:
- 数据流图: 描述数据在系统中的流动、处理、存储。是SA的核心工具。包含:外部实体、过程、数据流、数据存储。
- 数据字典: 定义DFD中出现的所有数据流、数据存储和数据项(元素)的精确含义、组成、格式、取值范围等。是系统数据的中央仓库。
- 实体关系图: 描述系统中的关键数据实体、实体属性以及实体之间的关系。用于建立数据模型(逻辑数据库设计的基础)。
- 过程规格说明: 详细描述DFD中最底层(不可再分)过程的处理逻辑。常用工具包括:结构化英语(伪码)、判定表、判定树。
- 状态转换图: 对于具有明显状态变化的系统(如实时控制系统),描述系统状态、引起状态转换的事件以及状态转换时执行的动作。
-
结构化设计:
- 目标: 将分析阶段得到的逻辑模型转化为具体的、可实现的物理模型,即系统“如何做”。重点是设计软件结构。
- 主要技术与工具:
- 结构图: SD的核心工具。描述程序的模块层次结构、模块间的调用关系以及模块间传递的数据(参数)。
- 设计原则:
- 模块化: 将大系统分解成小模块。
- 耦合: 衡量模块间相互依赖的程度。目标是低耦合(模块间联系尽可能少且简单)。
- 内聚: 衡量一个模块内部各元素(语句、数据)结合的紧密程度。目标是高内聚(模块内元素共同完成一个单一、明确的功能)。
- 从DFD到结构图的转换: 有特定的策略(如变换分析、事务分析)将DFD映射为初步的结构图。
- 数据设计: 基于ER图,设计物理数据库结构(表、字段、索引、关系)。
结构化方法的主要流派/代表:
- Yourdon/DeMarco 方法: 非常强调DFD和数据字典,是结构化分析最经典的代表。
- Gane & Sarson 方法: 另一种广泛使用的结构化分析方法,DFD符号与Yourdon略有不同。
- Jackson 系统开发方法: 强调数据结构对程序结构的主导作用。
- 结构化分析与设计技术: 由Douglas Ross提出,使用更丰富的图形符号集(活动图、数据图等)。
结构化方法的优点:
- 降低复杂性: 通过分解将大问题转化为小问题,易于理解和处理。
- 提高清晰度与可理解性: 图形化模型直观、标准,便于不同角色(用户、分析师、设计师、程序员)之间的沟通和验证。
- 强调文档化: 产生详尽的、标准化的文档,有利于知识传递、维护和审计。
- 支持自顶向下开发: 便于早期识别主要问题和架构。
- 设计原则明确: 耦合和内聚等原则为设计高质量软件提供了具体指导。
- 适用于数据处理密集型系统: 在处理以数据流和转换为主的系统(如传统业务信息系统)方面非常有效。
结构化方法的局限性:
- 对需求变化的适应性较差: 相对刚性,需求变更可能引起文档和设计的大量修改(瀑布模型的通病)。
- 数据和功能分离的割裂: 现实世界中的对象往往同时包含数据和操作数据的行为。结构化方法将两者分离建模,有时不能很好地映射现实。
- 对用户界面和交互密集型系统支持较弱: 早期结构化方法较少关注用户体验和人机交互设计。
- 可重用性支持有限: 主要关注特定系统的功能分解,对通用组件复用的支持不如面向对象方法。
- 可能产生“分析瘫痪”: 在大型复杂项目中,过度强调前期详尽的文档和建模可能导致项目进度缓慢。
- 与面向对象思维的差异: 现代软件开发主流是面向对象,结构化方法的思维模式与之不同,学习和转换有一定成本。
结构化方法与面向对象方法的对比:
特性 | 结构化方法 | 面向对象方法 |
---|---|---|
核心概念 | 功能、过程、数据流、模块 | 对象、类、属性、方法、继承、多态 |
分解方式 | 功能分解 | 对象分解 |
数据与功能 | 分离 | 封装在对象内部 |
关注点 | “做什么” (功能) | “谁做什么” (对象职责) |
建模工具 | DFD, ERD, 结构图 | 用例图, 类图, 时序图, 状态图等 |
适应性 | 对稳定需求较好,变更成本较高 | 对需求变化适应性更好 |
重用性 | 模块级重用 | 类级、组件级、模式级重用 |
典型适用 | 数据处理系统,事务处理 | 交互复杂系统,GUI应用,分布式系统 |
总结:
结构化方法是软件工程发展史上的重要里程碑。它提供了一套系统化、规范化的分析和设计框架,通过自顶向下分解、功能视角、数据和过程分离、图形化建模以及强调模块化设计原则,显著提高了软件开发的规范性和可控性。虽然在应对快速变化的需求和构建高度交互的系统方面不如面向对象方法灵活,但其核心思想(如分解、模块化、低耦合高内聚)仍然是现代软件设计的基石。理解结构化方法对于掌握软件工程的基础原理、阅读遗留系统文档以及在某些特定场景(如优化核心算法模块、设计底层服务)下进行设计仍然具有重要价值。它是学习更现代方法(如面向对象、面向服务)的重要基础。