结构化分析与设计
一种面向数据流的传统软件开发方法,以数据流为中心构建软件的分析模型和设计模型。
方法学
- 结构化分析(Structured Analysis 简称SA)
- 结构化设计(Structuresd Design 简称SD)
-
结构化程序设计(Structured Programmin 简称SP)
(区别OOA, OOD和OOP)
思想:抽象和分解。分解什么时候停止?直到问题足够简单为止。
结构化分析模型有哪些
数据流图
Data Flow Diagram(简称DFD):描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模,基本元素包括:
源或宿(外部实体)
存在于软件系统之外的人员或组织,表示软件系统输入数据的来源和输出数据的去向,因此也称为源点和终点。
加工和文件
- 加工:描述输入数据流到输出数据流的变换
- 文件:保存数据信息的外部单元
DFD中称为文件,但在具体实现时可以用文件系统实现(Java.io.* API),也可以用数据库系统实现(JDBC API)
数据流
每个数据流用由一组固定成分的数据组成并拥有一个定义明确的名字标识。
如:运动会管理系统中,报名单(数据流)由队名、姓名、性别、参赛项目等数据组成
数据流图的各个层次
- 顶层图只有代表整个软件系统的1个加工,描述了软件系统与外界(源或宿)之间的数据流
- 顶层图中的加工经分解后的图称为0层图(只有1张)
- 中间层图中至少有一个加工(也可以有多个)在下层图中分解成一张子图
- 处于最底层的图称为底层图,其中所有的加工不再分解成新的子图
图和加工的编号(前缀表示法)
- 顶层图只有一个代表整个系统的加工,不必编号。
- 0层图中的加工编号分别为1,2,3,…
- 子图号:若父图中的加工号x分解成某一子图,则该子图号记为“图x”
- 子图中加工的编号:若父图中的加工号为x的加工分解成某一子图,则该子图中的加工编号分别为x.1、x.2、x.3…
分层数据流图的一致性
-
父图与子图平衡
- 任何一张DFD子图边界上的输入/输出数据流必须与其父图中对应的加工的输入/输出数据流保持一致
-
数据守恒
- 一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者能通过该加工的处理而产生
- 多余的数据流:加工未使用其输入数据流中的某些数据项 (不一定是错误,但可能隐含潜在的错误)
- 局部文件:文件应该画在哪些DFD中,不应该画在哪些DFD中。
-
一个加工的输出数据流不能与该加工的输入数据流同名
- 同一个加工的输出数据流和输入数据流即使组成成份相同,仍应对它们取不同的名字,以表示它们是不同数据流。例如,“报名单”和“合格报名单”
- 允许一个加工有二个相同的数据流分别流向二个不同的加工
数据字典
数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型)。
数据字典由字典条目组成,每个条目描述DFD中的一个元素
数据字典条目包括:数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿。加工逻辑的详细说明可以用“小说明”来描述。
加工条目的描述内容
- 名称:加工名
- 别名:同数据流条目
- 加工号: 加工在DFD中的编号
- 简述:对加工的功能的简要说明
- 输入数据流:描述加工的输入数据流,包括读哪些文件
- 输出数据流:描述加工的输出数据流,包括写哪些文件
-
加工逻辑:简要描述加工逻辑,或者对加工规约的索引
- 基本加工的加工逻辑用小说明描述,在加工条目中可填写对加工规约的索引
- 非基本加工分解而成的DFD子图已反映了它的加工逻辑,不必书写小说明
- 异常处理:描述加工处理过程中可能出现的异常情况,及其处理方式
- 加工激发条件:描述执行加工的条件,如,“身份认证正确”,“收到报名单”
- 执行频率:描述加工的执行频率,如,每月执行一次,每天0点执行
- 注解:对加工的其它补充说明
结构化设计
结构化设计(Structured Design,简称SD)是一种将结构化分析得到的数据流图映射成软件体系结构的设计方法。强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则。
分为概要设计和详细设计两大步骤
- 概要设计是对软件系统的设计,采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构
- 详细设计是对模块实现细节的设计,采用结构化程序设计(Structured Programming,简称SP)方法
结构图
描述软件系统的体系结构,一个软件系统由哪些模块组成,以及模块之间的调用关系。结构图的基本成分有:模块、调用和数据。
模块(module)
它们是组成程序的基本单元。一个模块具有其外部特征和内部特征。
- 外部特征包括:模块的接口(模块名、输入/输出参数、返回值等)和模块的功能
- 内部特征包括:模块的内部数据和完成其功能的程序代码(SD中忽略)
调用和数据
- 调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者
- 为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块
- 数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示
启发式设计策略
- 降低耦合度,提高内聚度
-
避免高扇出,并随着深度的增加,力求高扇入
避免如图a那样的“平铺”形态,较好的结构图形态是如图b那样的“椭圆”型
- 模块的影响范围应限制在该模块的控制范围内
- 降低模块接口的复杂程度和冗余程度,提高一致性
模块接口上应尽可能传递简单数据,而且传递的数据应保持与模块的功能相一致,即不传递与模块功能无关的数据 - 模块的功能应是可预测的,避免对模块施加过多的限制
模块功能可预测是指该模块对相同的输入能产生相同的输出
限制一个模块只处理单一的功能,那么,这个模块体现出高内聚 - 尽可能设计单入口和单出口的模块
单入口和单出口的模块能有效地避免内容耦合
信息流
信息流可分为两类:
- 变换流(transform)
- 事务流(transaction)
变换流型的DFD图可明显地分成输入、变换、输出三部分
数据流沿着输入通路到达一个事务中心,事务中心根据输入数据的类型在若干条动作通路(action path)中选出一条来执行,具有这种特征的信息流称为事务流。
事务中心的任务是:
- 接收事务(输入数据)
- 分析每个事务以确定它的类型
-
根据事务类型选取一条动作通路
合并那些需要一连串参数传递的模块。删掉管道模块(输入控制,报名处理,输出控制)。
将那些相对独立的功能模块独立出来。(分析试题难度和分类统计成绩)