结构化分析与设计(Structured Analysis and Design, SAD)是一种传统的软件开发方法,强调自顶向下、逐步求精的结构化思维,通过清晰的阶段划分和规范化的文档,将复杂系统分解为可管理的模块。它适用于需求明确、流程稳定的项目(如企业资源规划系统、大型业务管理系统),尤其在早期软件开发中应用广泛。以下从核心思想、分析与设计过程、工具与方法、优缺点等方面展开说明:
一、核心思想与基本原则
-
自顶向下,逐步分解
- 将复杂系统逐层拆解为子系统、模块,直至可实现的最小单元(如流程图中的具体操作步骤)。
- 示例:将“电商系统”分解为订单管理、支付系统、库存管理等子系统,再进一步分解为“订单创建”“支付回调”等模块。
-
模块化设计
- 每个模块具有独立功能,通过明确的接口(如数据流、控制流)与其他模块交互,降低耦合度。
- 原则:高内聚、低耦合(模块内部功能紧密相关,模块间依赖松散)。
-
基于数据流建模
- 以数据流动为核心,分析系统如何接收输入、处理数据、产生输出,不强调对象的封装性(与面向对象方法的区别)。
二、结构化分析(Structured Analysis, SA)
目标
- 明确系统“做什么”,建立系统的逻辑模型,不涉及具体实现细节。
主要活动与工具
-
数据流图(Data Flow Diagram, DFD)
- 作用:描述数据在系统中的流动路径,分为4个基本元素:
- 数据源/终点(如用户、外部系统)
- 加工处理(如订单验证、库存更新)
- 数据流(如“订单数据”“支付结果”)
- 数据存储(如数据库、文件)
- 分层结构:
- 顶层图:概括系统整体输入输出(如用户下单→系统处理→返回订单状态)。
- 0层图:分解顶层图为主要加工模块(如订单处理、支付处理、库存处理)。
- 细节图:逐层细化每个加工模块的子流程(如“订单处理”分解为“用户信息校验”“商品库存查询”)。
- 作用:描述数据在系统中的流动路径,分为4个基本元素:
-
数据字典(Data Dictionary)
- 作用:对数据流图中的每个数据元素(如数据流、数据存储、加工处理)进行精确定义,确保需求无歧义。
- 内容示例:
数据元素 描述 数据类型 来源/去向 订单编号 唯一标识订单的字符串 String(32) 由系统自动生成 支付金额 订单的实际支付金额 Decimal(10,2) 来源于支付接口返回
-
加工逻辑说明
- 用结构化语言(如“如果…那么…否则…”)、判定表(处理多条件逻辑)或判定树描述加工模块的具体逻辑。
- 示例(判定表):
条件 订单金额≤100元 订单金额>100元且≤300元 订单金额>300元 优惠策略 无折扣 9折优惠 8折优惠
三、结构化设计(Structured Design, SD)
目标
- 将分析阶段的逻辑模型转化为“怎么做”的物理模型,定义系统的模块结构和交互方式。
主要活动与方法
-
从数据流图导出模块结构
- 变换型设计:适用于具有明显“输入-处理-输出”流程的系统(如批处理系统)。
- 步骤:
- 识别输入流、变换中心(核心处理)、输出流。
- 设计顶层模块(如“主控制器”),下层模块分别对应输入、处理、输出。
- 步骤:
- 事务型设计:适用于处理多种事务类型的系统(如银行交易系统)。
- 步骤:
- 识别事务源(如不同类型的交易请求)、事务中心(路由逻辑)、各事务处理模块。
- 设计“事务调度模块”根据输入类型调用相应处理模块。
- 步骤:
- 变换型设计:适用于具有明显“输入-处理-输出”流程的系统(如批处理系统)。
-
模块结构图(Structure Chart, SC)
- 作用:描述模块间的调用关系和层次结构,用矩形表示模块,箭头表示调用方向(从上层模块指向下层模块)。
- 元素:
- 调用:模块间的执行顺序(如“订单模块”调用“支付模块”)。
- 数据传递:模块间传递的数据(如订单金额、支付状态)。
- 控制信息:影响模块逻辑的标志(如“库存不足”信号)。
- 示例:
主程序 ├─ 订单处理模块 │ ├─ 用户信息校验模块 │ └─ 商品库存查询模块 └─ 支付处理模块 ├─ 支付接口调用模块 └─ 支付结果解析模块
-
模块设计原则
- 控制范围与作用范围:
- 模块的“作用范围”(受该模块决策影响的区域)应在其“控制范围”(该模块及其下属模块)内,避免跨模块无效决策。
- 扇入与扇出:
- 扇入:模块被上层模块调用的次数(扇入高表示复用性好,如“日志模块”被多个模块调用)。
- 扇出:模块调用下层模块的数量(扇出一般不超过5,避免模块过于复杂)。
- 控制范围与作用范围:
四、结构化分析与设计的优缺点
优点 | 缺点 |
---|---|
1. 阶段清晰,文档规范,适合大型团队协作 | 1. 对需求变更的适应性差(需重新调整模型) |
2. 强调逻辑分析,适合流程明确的业务场景 | 2. 缺乏对“对象”和“状态”的封装,复用性较低 |
3. 工具简单(如DFD、SC),易于学习掌握 | 3. 后期维护成本高(模块间可能隐含紧耦合) |
五、与面向对象方法的对比
维度 | 结构化分析与设计 | 面向对象方法(如UML) |
---|---|---|
核心思想 | 基于数据流和功能分解 | 基于对象封装、继承、多态 |
建模重点 | 流程(怎么做) | 实体(对象是什么)及其交互 |
需求变更 | 难(需修改多层模型) | 易(通过类扩展实现) |
典型工具 | DFD、SC、数据字典 | 类图、用例图、顺序图 |
适用场景 | 流程固定、需求明确的系统(如传统企业软件) | 复杂业务、需高复用性的系统(如互联网应用) |
六、应用场景与现状
- 传统场景:仍用于政府政务系统、银行核心业务系统等需求稳定的项目。
- 现代演变:部分思想(如模块化、分层设计)被融入敏捷开发或混合开发模式中,与面向对象方法结合使用(如用DFD分析业务流程,再用类图实现对象建模)。
总结
结构化分析与设计通过“分解-抽象”的思维将复杂系统结构化,提供了一套标准化的建模流程和文档体系,适合需求明确、流程固定的软件开发。尽管在灵活性和复用性上不及现代方法,但其“自顶向下”的设计理念仍是理解系统架构的基础,尤其对新手掌握系统分析与设计的逻辑思维具有重要价值。