结构化分析与设计是一种面向数据流的传统软件开发方法,它以数据流为中心构建软件的分析模型和设计模型。
结构化方法由结构化分析、结构化设计和结构化程序设计组成。
一、结构化方法概述
1. 抽象和分解
结构化方法采用自顶而下逐层分解的思想进行分析建模,充分体现了抽象和分解的原则。
随着分解层次的增加,抽象级别也越来越低,越来越接近问题的解。
2. 结构化分析过程
①理解当前的现实环境,获得当前系统的具体模型(物理模型)。
②从当前系统的具体模型中抽象出当前系统的逻辑模型。
③分析目标系统和逻辑模型,建立目标系统更正后的逻辑模型。
④为逻辑模型做补充。
3. 结构化分析模型的描述方式
数据字典是核心,包括对软件使用和产生的所有数据的描述。
数据流图用于系统的功能建模,描述系统的输入数据如何一步一步变成输出数据。
实体-关系图(E-R图)用于数据建模,描述数据字典中数据的关系。
状态转换图用于行为建模,用于描述系统接收哪些外部事件,以及外部事件的作用下系统状态的迁移。
4. 结构化分析结果
一套分层的数据流图 一本数据字典(包括数E-R图) 一组加工规约以及其他材料补充
二、数据流图DFD图
1. 数据流图的图形表示
(1)数据流图基本图形元素
①数据流
数据流由一组固定成分的数据组成。
DFD图中的每一个数据流必须用一个定义明确的名字标识。
对于流入文件或者从文件流出的数据流,由于他们代表文件的一个记录,意义明确,不用为它们命名。
②加工
加工描述了输入数据流到输出数据流的变换,即将输入数据流加工成输出数据流。
③文件
文件用于存放数据。
每个文件用一个定义明确的名字标识。
④源或宿
通常指存在于系统之外的人员或组织,表示系统输入数据的来源或输出数据的去向,因此也成为源点或终点。
源和宿用相同的符号表示,当数据流从该符号流出时,表示源;当数据流入该符号时,表示宿;两者皆有时,既是源又是宿。
(2)数据流图的扩充符号
一个加工可能有多个输入数据流和输出数据流,这些扩充符号的作用就是描述多个数据流之间的关系。
①星号(*)
星号表示数据流之间存在“与”的关系,即数据流必须全部到达后才能进行加工或输出。
②加号(+)
加号表示数据流之间存在“或”的关系,即数据流中有任意一个到达就能进行加工或输出。
③异或(⊕)
异或号表示数据流之间存在“异或”关系,即数据流当且仅当一个到达才能进行加工或者输出。
(3)数据流图的层次结构
理论上,只要纸张够大,一个软件系统的分析模型就可以画在一张纸上。然而一个复杂的系统可能涉及几百上千个数据流,如果画在一张纸上,则会十分复杂,不宜阅读和理解。
根据自顶向下逐层分解的思想,可以将数据流图画成下图所示的层次结构,每张图的加工数大概控制在“7加减2”(研究表明这是人们短期记忆的限值数)的范围内,从而构成一套分层数据流图。
①层次结构
顶层图:分层数据流图顶层只有一张图,其中只有一个加工,代表整个软件系统,该加工描述软件系统与外界之间的数据流,称为顶层图。
0层图:顶层图中的加工经分解后的图称为0层图,也只有一张。
底层图:处于分层数据流图最底层的图称为底层图,底层图中的所有加工都不再分解。
中间层图:处于0层和底层之间的图称为中间层图。其中至少有一个加工可以分解成一张子图。
基本加工:在整套分层数据流图中,凡是不再分解成子图的加工称为基本加工。
②图和加工的编号
父图和子图:如果某图 A 的某一个加工分解成一个子图 B ,称A是B的父图,B是A的子图。
若父图中有n个加工,那么它可以有0~n张子图,但是每张子图只能对应以一张父图。
为了方便管理和查找,需要对DFD中的图和加工进行编号:
顶层图中只有一个加工,不需要编号。
0层图中的加工编号为1、2、3、4.....
对于子图号,若父图的加工号 x 分解成某一子图,则该子图记为"图x"。
对于子图中加工的编号,若父图中的加工号 x 的加工分解成某一子图,则该子图中的加工记为x.1、x.2、x.3.....
2. 分层数据流图画法
(1)画出系统的输入和输出
系统的输入输出用顶层图来描述,即描述系统从外部的哪些源获取输入数据流,以及系统的哪些输出数据流输出到哪些外部的宿,也就是画出顶层图。
①确定源和宿
②确定加工(只有一个,就是系统)
③确定数据流
(2)画出系统内部结构
将顶层图中的加工分解成若干加工,并用一些新定义的数据流进行连接,使得系统的输入数据流经过一系列加工处理后,变化成输出数据流,也就是画出0层图。
①确定加工
根据功能分解来确定加工(一般用于高层加工的分解)
根据业务处理来确定加工(一般用于低层加工的分解)
②确定数据流
③确定文件
④确定源和宿
(3)画出内部加工
采用画第0层的方法即可。
三、数据流图的审查
1. 分层数据流图的一致性和完整性
一致性指不存在矛盾和冲突
完整性指本身的完整性,即是否有遗漏的数据流或者加工。
①分层数据流图的一致性
父图与子图的一致性:指任何一种DFD子图边界上的输入输出流必须与其父图中对应加工的输入输出流保持一致。
数据守恒:
加工所有的输出流数据中的数据,必须能从该加工的输入流数据中直接或者经处理获得。
加工未使用输入流中的某些数据项可以去掉。
局部文件:
一般来说,任何一个文件都应有写入的数据流和读取的数据流。
一旦一个文件在某张DFD图画出,那么在它子图中都要画出。
一个加工的输入数据流不能和该加工的输出数据流同名
②分层数据流图的完整性
每个加工至少有一个输入流和一个输出流。
在整套分层数据流图中,每个文件至少有一个加工写入,一个加工读取。
分层数据流图中的每一个数据流和文件都必须命名(除了流入文件和流出文件的数据流),并且与数据字典一致。
分层DFD图的每一个基本加工都应有一个加工规约。
2. 构造分层DFD时需要注意的问题
适当命名
画数据流而不是控制流
避免一个加工有过多的数据流
分解尽可能均匀
先考虑稳定状态,忽略琐碎的枝节
随时准备重画
3. 分解的程度
遵循几条原则:
7 加减 2
分解自然,概念上合理清晰
只要不影响DFD易读性,可以适当增加加工数,减少层数
上层多分解几个加工,下层少分解加工
分解要均匀
四、数据字典
1. 字典条目的种类及描述符号
种类:
数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿。
符号:
2. 字典条目
数据流条目:
文件条目:
数据项条目:
加工条目:
源或宿条目:
别名条目:
五、描述基本加工的小说明
1. 结构化语言
2. 判定表
条件桩:列出各种条件的对象,每行写一个条件对象。
条件条目:列出各件对象的取值,条件条目的每一列表示了一个可能的条件组合。
动作桩:列出所有可能采取的动作,每行写一个动作。
动作条目:列出各种条件组合下应采取的动作。
3.判定树
判定树是判定表的变种,本质上与判定表相同,只是表现形式不同。
六、结构化设计概述SD
结构化设计SD是将结构化分析得到的数据流图映射成软件体系结构的一种设计方法。
1. 结构图
结构化设计用结构图来描述软件系统的体系结构,指出一个软件系统由哪些模块组成,以及模块之间的调用关系。
(1)结构图的基本成分
模块:
模块是指具有一定功能并可以用模块名调用的一组程序语句,如函数、子程序等,它是组成程序的基本单元。
调用:
模块之间的调用关系用从一个模块指向另一个模块的箭头来表示,含义为前者调用后者。
数据:
模块调用传递的数据可以通过调用箭头旁加一个小箭头和数据名来表示,小箭头表示响应数据传输方向。
(2)结构图的辅助符号
(3)结构图的几个概念
深度:
指结构图中控制的层数,上图中为5.
宽度:
指结构图中同一层次上模块总数的最大值。上图为7.
扇出:
指该模块直接调用的模块数目。如M的扇出是4.
扇入:
指能直接调用该模块的模块数目。如R的扇入是4.
2. 启发式设计策略
改造程序结构图,降低耦合度,提升内聚度
避免高扇出,随着深度的增加,力求高扇入
模块的影响范围应限制在该模块的控制范围内
降低模块接口的发杂程度和荣誉程度,提高一致性
模块功能应该是可预测的,避免对模块施加过多的限制
尽可能设计单入口和单出口的模块
3. 结构化设计的步骤
1. 建立初始结构图
2. 对结构图改进
3. 书写设计文档
4. 设计评审
七、数据流图到软件体系结构的映射
1. 信息流
信息流可以分为变换流和事务流。
变换流:
变换流数据流图可以明显的分为输入、变换、输出三部分。
事务流:
事务流数据流图具有以下特征:
数据流沿着输入路径到达一个事务中心,事务中心根据输入数据的类型在若干动作路径中选择一条来执行。
2. 数据流图映射到结构图的步骤
①复审和精化数据流图
②确定数据流图的类型
③将DFD图映射成结构图
④改进初始结构图
3. 变换分析
变换分析的任务是将变换型的DFD映射成初始的结构图。
①划定输入流和输出流的边界,确定变换中心
②进行第一级分解
③进行第二级分解
④标注输入输出信息
4. 事务分析
①确定事务中心
②将DFD图映射成事务型结构图
③分解每条动作路径对应的结构图