软件工程导论-第五章 结构化分析与设计
结构化设计(Structured Design,简称SD)是一种将结构化分析得到的数据流图(DFD图)映射成软件体系结构(结构图MSD)的设计方法。强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则分为概要设计和详细设计两大步骤概要设计是对软件系统的总体设计采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用
几类主要的软件开发方法:
结构化方法,即SA、SD方法
面向数据结构的软件开发方法
面向对象的软件开发方法
重点
一、结构化分析方法概述
结构化方法
- 结构化方法即结构化分析与设计方法,是一种面向数据流的传统软件开发方法;
- 它以数据流为中心构建软件的分析模型和设计模型;
- 分为:
- 结构化分析(Structured Analysis简称SA)
- 结构化设计(Structuresd Design简称SD)》
- 结构化程序设计(Structured Programmin简称SP)
结构化分析与建模
- 主要思想:抽象与自顶向下的逐层分解(控制复杂性的两个基本手段)
- 抽象与分解
- 抽象:忽略一个问题中与当前目标无关的那些方面,以便更充分地关注与当前自标有关的方面
- 分解:将问题不断分解为较小的问题 直到每个最底层的问题都足够简单为止
随着分解层次的增加,抽象的级别越来越低,也越接近问题的解(算法和数据结构)
结构化分析过程
- 理解当前的现实环境,获得当前系统的具体模型(物理模型
- 从当前系统的具体模型抽象出当前系统的逻辑模型
- 分析目标系统与当前系统逻辑上的差别,建立目标系统的逻辑模型
- 为目标系统的逻辑模型作补充
结构化系统分析模型的组成结构
- 数据字典
- 数据流图
- E-R图
- 状态转换图
结构化分析模型的描述
- 数据字典是模型的核心,它包含了软件使用和产生的所有数据的描述
- 数据流图:用于功能建模,描述系统的输入数据流如何经过一系列的加工变换逐步变换成系统的输出数据流,数据流图中的数据流、文件、数据项、加工在数据字典中描述,反映加工逻辑的加工规约用“小说明”描述。
- E-R图用于数据建模,描述数据字典中数据之间的关系。
- 状态转换图用于行为建模,描述系统接收哪些外部事件,以及在外部事件的作用下系统的状态迁移(从一个状态到另一个状态)
- 控制规约用来描述软件控制方面的附加信息
二、数据流图
数据流图Data Flow Diagram(简称DFD)
数据流图的图形表示
数据流图的基本图形元素及其扩充符号
数据流图的基本图形元素
描述输入数据流到输出数据流的变换(即加工)过程,用于对系统的功能建模,基本元素包括:
- →数据流(data flow)
- 每个数据流用由一组固定成分的数据组成并拥有一个定义明确的名字标识
- 数据流的流向
从一个加工流向另一个加工
从加工流向文件(写文件)
从文件流向加工(读文件)
从源流向加工
从加工流向宿
- 〇 加工(process)
- 描述输入数据流到输出数据流的变换
- 每个加工用一个定义明确的名字标识
至少有一个输入数据流和一个输出流
可以有多个输入数据流和多个输出数据流
- =文件(file)(读取是箭头指出、写入是箭头指入,都有是修改)
- 保存数据信息的外部单元
- 每个文件用一个定义明确的名字标识
由加工进行读写
DFD中称为文件,但在具体实现时可以用文件系统实现,也可以用数据库系统实现
- ▭源或宿(source or sink):表示存在于系统之外的对象,以帮助我们理解系统数据的来源和去向,表示软件系统输入数据的来源和输出数据的去向,因此也称为源点和终点(源是箭头指出、宿是箭头指入,都有则既是源又是宿)
- 数据流和数据存储的区别。
答:数据流和数据存储都是数据,但是它们所处的状态不是
一样的,数据存储是出于静止状态的数据,数据流是处于
运动中的数据。
数据流图的扩充符号
- 描述一个加工的多个数据流之间的关系
- 星号(大):表示数据流之间存在“与”关系
所有输入数据流同时存在时,才能进行加工处理
或者加工处理的结果是同时产生所有输出数据流 - 加号(十):表示数据流之间存在“或”关系
至少存在一个输入数据流时,才能进行加工处理
或者加工处理的结果至少产生一个输出数据流 - 异或(⊕):表示数据流之间存在“异或”(互斥)关系
必须存在且仅存在一个输入数据流时,才能进行加工处理
或者加工处理的结果产生且仅产生一个输出数据流
- 星号(大):表示数据流之间存在“与”关系
数据流图的各个层次
- 在多层数据流图中,顶层流图仅包含一个加工,它代表被开发系统。它的输入流是该系统的输入数据,输出流是系统所输出数据(只有1张)
- 顶层图中的加工经分解后的图称为0层图(只有1张)
- 底层流图是指其加工不需再做分解的数据流图,它处在最底层
- 中间层流图则表示对其上层父图的细化它的每一加工可能继续细化形成子图
图和加工的编号
- 顶层图只有一个代表整个软件系统的加工,该加工不必编号。
- 0层图中的加工编号分别为1,2,3
- 子图号:若父图中的加工号x分解成某一子图,则该子图号记为“图x”
- 子图中加工的编号:若父图中的加工号为x的加工分解成某一子图,则该子图中的加工编号分别为x.1、x.2、x3…
数据流图的绘制
- 确定系统的外部项
- 画出顶层图
- 自顶向下逐层分解
直到基本加工 - 检查
- 征求用户意见
- 定稿
- 复审
分层数据流图示例
-
资格和水平考试的考务处理系统
- 简化的资格和水平考试的考务处理系统分成多个级别,如初级程序员、程序员、高级程序员、系统分析员等,凡满足一定条件的考生都可参加某一级别的考试
- 考试的合格标准将根据每年的考试成绩由考试中心确定:
- 考试的阅卷由阅卷站进行,因此,阅卷工作不包含在软件系统中。
-
功能需求
1.对考生送来的报名单进行检查
2.对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站
3.对阅卷站送来的成绩清单进行检查,并根据考试中心制订的合格标准审定合格者
4.制作考生通知单送给考生
5.进行成绩分类统计(按地区、年龄、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表 -
部分数据流的组成
- 名单=地区+序号+姓名+文化程度+职业+考试级别+通信地址
- 正式报名单=准考证号+报名单
- 准考证=地区+序号+姓名+准考证号+考试级别+考场
- 考生名单={准考证号+考试级别}
- 考生名册=正式报名单
- 统计分析表=分类统计表+难度分析表
- 考生通知单=准考证号+姓名+通信地址+考试级别+考试成绩+合格标志
-
例如,对一个考务处理系统而言
考生向系统提供报名单(输入数据流),所以老生是考试系统(软件)的一个源;
系统向考生发放准考证、考生通知单,所以考生是考试系统(软件)的一个宿;
考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿;
系统将考生名单给阅卷站,所以阅卷站是该系统的一个宿;
阅卷站将成绩清单返回给系统,所以阅卷站是该系统的一个源。
确定源或宿:考生、阅卷站和考试中心
它们都既是源又是宿 -
画系统的输入输出(顶层图)
- 顶层图唯一的加工:软件系统(考务处理系统)
- 确定数据流:系统的输入输出信息
- 输入数据流:报名单(来自考生)、成绩清单(来自阅卷站)、合格标准(来自考试中心)
- 输出数据流:准考证(送往考生)、考生名单(送往阅卷站)、考生通知书(送往考生)、统计分析表(送往考试中心)
- 额外的输出流(考虑系统的健壮性):不合格报名单(返回给考生),错误成绩清单(返回给阅卷站)
顶层图通常没有文件
-
画系统内部(0层图)
以下确定加工、数据流、文件、源或宿的一般方法适用于0层图及其各层子图
- 确定加工:确定父图中某加工分解而成的子加工-1
- 根据功能分解来确定加工:将一个复杂的功能分解成若干个较小的功能,较多应用于高层DFD中的分解
- 根据业务处理流程确定加工:分析父图中待分解加工的业务处理流程,业务流程中的每一步都可能是一个子加工
- 特别要注意在业务流程中数据流发生变化或数据流的值发生变化的地方,应该存在一个加工,例如:
- 确定数据流-2
- 在父图中某加工分解而成的子图中,父图中相应加工的输入输出数据流都是且仅是子图边界上的输入/输出数据流
- 分解后的子加工之间应增添相应的新数据流表示加工过程中的中间数据
- 如果某些中间数据需要保存以备后用,那么可以成为流向文件的数据流
- 同一个源或加工可以有多个数据流流向一个加工,如果它们不是一起到达和一起加工的,那么可以将它们分成若干个数据流,例如:
- 确定文件-3
- 如果父图中该加工存在读写文件的数据流,则相应的文件和数据流都应画在子图中
- 在分解子图中,如果需要保存某些中间数据以备后用,则可以将这些数据组成一个新的文件
- 新文件(首次出现的文件)至少应有一个加工为其写入记录,同时至少存在另一个加工来读该文件的记录
- 注意:从父图中继承下来的文件在子图中可能只对其进行读,或只进行写
- 确定源和宿-4
- 0层图和其它子图中通常不必画出源和宿
- 有时为了提高可读性,可以将顶层图中的源和宿画在0层图中
- 最终得到考务处理系统0层图
- 根据功能分解方法识别出两个加工:考试报名、统计成绩
- 数据流
继承顶层图中的输入数据流和输出数据流
定义二个加工之间的数据流:由于这二个加工分别在考试
前后进行,因此登记报名单所产生的结果“考生名册”应
作为文件保存以便考试后由统计成绩加工引用
- 确定加工:确定父图中某加工分解而成的子加工-1
- 复杂的加工可以继续分解成1张DFD子图
- 分解方法
将该加工看作一个小系统,该加工的输入/输出数据流就是这个假设的小系统的输入/输出数据流
然后采用画0层图的方法,画出该加工的子图 - 以0层图中加工1(考试报名)为例
根据业务处理流程来确定由加工1的分解
与加工1相关的业务流程:首先检查考生送来的报名单,然后编准考证号,并产生准考证,最后产生考生名单和考生名册(文件)》
- 分解方法
- 加工1子图
3个子加工:检查报名单、编准考证号、登记考生
"合格报名单”和“正式报名单”是新增加的数据流其它数据流都是加工1原有的
在加工1的分解中没有新的文件产生
- 加工2子图
- 以0层图中加工2(统计成绩)为例
根据业务处理流程来确定由加工2的分解 - 与加工2相关的业务流程:
√首先检查阅卷站送来的成绩清单,并根据考试中心制定的合格标准审定合格者。
√制作考生通知单并发放给考生。
√进行成绩分类统计(按地区、文化程度、职业、考试级别等分类)和试题难度分析,产生统计分析表。
- 以0层图中加工2(统计成绩)为例
- 总结:画分层数据流图的步骤
1.画系统的输入和输出
2.画系统内部
3.画加工内部
4.重复第3步,直至每个尚未分解的加工都足够简单(即不必再分解)
三、分层数据流图的审查
本节将从分层DFD的一致性和完整性、构造分层DFD时需注意的问题以及分解程度等几个方面来说明如何审查分层DFD的合理性
分层数据流图的审查
检查图中是否存在错误或不合理(不理想)的部分
分层数据流图的一致性:分层DFD中不存在矛盾和冲突
- 父图与子图平衡
任何一张DFD子图边界上的输入/输出数据流必须与其父图中对应的加工的输入/输出数据流保持一致 - 数据守恒
一个加工所有输出数据流中的数据,必须能从该加工的输入数据流中直接获得,或者能通过该加工的处理而产生
多余的数据流:加工未使用其输入数据流中的某些数据项(不一定是错误,但可能隐含潜在的错误)
数据不守恒的实例
由于“正式成绩清单”中缺少“考生通知单”中的姓名、通信地址等数据,这些数据也无法由加工2.3自己产生,因此,加工2.3不满足数据守恒的条件
由此可见:
1.数据流的组成对DFD是有影响的
2.构建DFD与建立数据字典应交替进行,以便于对分层DFD的校验 - 局部文件
考虑分层数据流中一个文件应画在哪些DFD中,而不该画在哪些DFD中- 任何一个文件都应同时包含读和写该文件的数据流除非该文件是当前系统与另一个软件系统所共享(应在需求说明中指明)
- 在一张DFD中当一个文件作为若干个加工之间的交界面(一个写另一个读肉)时该文件应画出
- 在一张DFD中当一个文件仅与一个加工进行读写操作并且在该DFD的父(祖先)图中未出现过该文件,则该文件是相应加工的内部文件,在当前DFD中不应画出
- 一个文件一旦在某张DFD中画出,那么在它的子孙图中应根据父图与子图平衡的原则画出该文件
- 在子孙图中,这个文件可能只有读文件的数据流或者写文件的数据流
*局部文件示例
“试题得分清单”文件是加工2的局部文件,根据抽象原则不应该将这类表示加工细节的局部文件画在其父图(如图c)中,正确的画法是图a和b
- 一个加工的输出数据流不能与该加工的输入数据流同名
同一个加工的输出数据流和输入数据流即使组成成份相同,仍应对它们取不同的名字,以表示它们是不同数据流
例如,“报名单”和“合格报名单”
允许一个加工有二个相同的数据流分别流向二个不同的加工
分层数据流图的完整性:分层DFD本身的完整性,即是否有遗漏的数据流、加工等元素
- 每个加工至少有一个输入数据流和一个输出数据流
- 在整套分层数据流图中,每个文件应至少有一个加工读该文件,有另一个加工写该文件
- 分层数据流图中的每个数据流和文件都必须命名(除了流入或流出文件的数据流),并保持与数据字典的一致
- 分层DFD中的每个基本加工(即不再分解子图的加工)都应有一个加工规约
其它需注意的问题
-
适当命名:每个数据流、加工、文件、源和宿都应被适应地命名,名字应符合被命名对象的实际含义
-
画数据流而不是画控制流:判断准则:这条线上是否有数据流过
-
分解尽可能均匀
理想目标:任何两个加工的分解层数之差不超过1
应尽可能使分解均匀,对于分解不均匀的情况应重新分解 -
先考虑稳定状态,忽略琐碎的枝节
先考虑稳定状态下的各种问题,暂时不考虑系统如何启动、如何结束、出错处理以及性能等问题 -
随时准备重画
对于一个复杂的软件系统,往往要经过反复多次的重画和修改才能构造出完整、合理、满足用户需求的分层DFD分析阶段遗漏下来的一个错误,到开发后期要化费几百倍代价来纠正这个错误
分解的程度
- 可参照以下几条与分解有关的原则:
7加减2
分解应自然,概念上合理、清晰
只要不影响DFD的易理解性,可适当多分解几个加工,以减少层数
一般说来,上层分解得快些(即多分解几个加工),下层分解得慢些(即少分解几个加工)
分解要均匀
四、数据字典
- 数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型)
- 数据字典由字典条目组成,每个条目描述DFD中的一个元素
- 数据字典条目包括:数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿
数据字典的描述符号
字典条目
- 不同的开发组织或团队可以根据项目的需要定义字典条目的描述内容
- 字典条目中的描述内容主要包括
DD元素的基本信息(名称、别名、简述、注解)
定义(数据类型、数据组成
使用特点(取值范围、使用频率、激发条件)
控制信息(来源、去向、访问权限)等
数据流组成
- 数据流组成是数据流条目的核心,它列出组成该数据流的各数据项,例如:
培训报名单=姓名十单位十课程
运动员报名单=队名十姓名十性别十{参赛项目} - 当一个数据流的组成比较复杂时,可以将其分解成几个数据流,例如
课程=课程名十任课教师十教材十时间地点
时间地点={星期几十第几节+教室}
描述内容
文件条目的描述内容
名称:文件名
别名:同数据流条目
简述:对文件的简单说明
文件组成:描述文件的记录由哪些数据项组成(与数据流条目中的文件组成描述方法相同)
写文件的加工:描述哪些加工写文件
读文件的加工:描述哪些加工读文件
文件组织:描述文件的存储方式(顺序、索引),排序的关键字
使用权限:描述各类用户对文件读、写、修改的使用权限
数据量:文件的最大记录个数
存取频率:描述对该文件的读写频率
注解:对该文件的其它补充说明
数据项条目的描述内容
数据项也称数据元素,是数据的最小组成单位。
名称:数据项名
别名:同数据流条目
简述:对数据项的简单描述
数据类型:描述数据项的类型,如整型、实型、字符串等
计量单位:指明数据项值的计量单位,如公斤、吨等
取值范围:描述数据项允许的值域,如1…100
编辑方式:描述该数据项外部表示的编辑方式,如23,345.67
与其它数据项的关系:描述该数据项与数据字典中其它数据项的关系
注解:对数据项的其它补充说明
加工条目的描述内容
名称:加工名
别名:同数据流条目
加工号: 加工在DFD中的编号
简述:对加工的功能的简要说明
输入数据流:描述加工的输入数据流,包括读哪些文件
输出数据流:描述加工的输出数据流,包括写哪些文件
加工逻辑:简要描述加工逻辑,或者对加工规约的索引
基本加工的加工逻辑用小说明描述,在加工条目中可填写对加工规约的索引
非基本加工分解而成的DFD子图已反映了它的加工逻辑,不必书写小说明
异常处理:描述加工处理过程中可能出现的异常情况,及其处理方式
加工激发条件:描述执行加工的条件,如,“身份认证正确”,“收到报名单”
执行频率:描述加工的执行频率,如,每月执行一次,每天0点执行
注解:对加工的其它补充说明
源或宿条目的描述内容
名称:源或宿的名称(外部实体名)
别名:同数据流条目
简要描述:对源或宿的简要描述(包括指明该外部实体在DFD中是用作“源”,还是“宿”,还是“既是源又是宿”)
输入数据流:描述源向系统提供哪些输入数据流
输出数据流:描述系统向宿提供哪些输出数据流
注解:对源或宿的其它补充说明
别名条目的描述内容
只有那些有必要补充说明的别名才给出相应的别名条目
别名:别名的名字
类型:指出别名属于那个种类(数据流、文件、数据、加工、源或宿)
基本名:别名的正式名称(原名)
简述:同正式名称的简述
说明:对别名的补充说明
数据字典的实现
提倡采用专用的软件工具或者常用的实用程序(如,正文编辑程序、电子表格)来建立数据字典的电子文档,其好处是便于字典条目的检索,字典的管理和维护
如果数据字典由辅助绘制DFD的工具自动产生的话,那么可以利用数据字典来检查DFD的一致性和完整性,并保持数据字典与DFD的一致
如果数据字典是由人工制作的,我们可以为每个字典条目制作一张卡片,所有卡片按字典条目的种类(数据流、文件、加工等)分类成册,每类卡片按某种约定排序
五、描述基本加工的小说明
• 小说明是基本加工的规约说明,应精确地描述用户要求一个加工“做什么”
• 包括加工的激发条件、加工逻辑、优先级、执行频率、出错处理等
• 最基本的部分是加工逻辑,即该加工的输出数据流与输入数据流之间的逻辑关系
• 加工逻辑不是对加工的设计,不涉及数据结构、算法实现、编程语言等与设计和实现有关的细节
加工逻辑的描述方法
- 结构化语言:介于自然语言和形式语言之间的一种半形式语言
• 没有严格的语法
• 加工规约分为若干个段落,每个段落可分为内外两层:
外层有严格的语法来描述它的控制结构
• 如结构化英语中可使用if_then_else、while_do、repeat_until、for_do、case等结构
内层可以用自然语言来描述
• 允许使用嵌套结构 - 判定表:适用于加工逻辑包含多个条件,而不同的条件组合需做不同的动作
• 判定表的组成元素
条件桩(Condition Stub):列出各种条件的对象,如发货单金额,赊欠天数等,每行写一个条件对象
条件条目(Conditien entry):列出各条件对象的取值,条件条目的每一列表示了一个可能的条件组合
动作桩(action stub):列出所有可能采取的动作,如发出发货单等,每行写一个动作
动作条目(action eutry):列出各种条件组合下应采取的动作 - 判定树:判定表的变种,它本质上与判定表是相同的,只是表示形式不同
• 本质上与判定表是相同的,只是表示形式不同
• 例如“审批发货单”加工逻辑的判定树描述入下:
案例1:仓库发货方案如下,请用结构化语言、判定树及判定表描述
六、结构化设计概述
结构化设计
- 结构化设计(Structured Design,简称SD)是一种将结构化分析得到的数据流图(DFD图)映射成软件体系结构(结构图MSD)的设计方法。
- 强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则
- 分为概要设计和详细设计两大步骤
- 概要设计是对软件系统的总体设计
采用结构化设计方法,其任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构 - 详细设计是对模块实现细节的设计,采用结构化程序设计(Structured Programming,简称SP)方法
- 概要设计是对软件系统的总体设计
- SA、SD和SP构成完整的结构化方法体系
*结构图
用结构图(Structure Chert)来描述软件系统的体系结构
描述一个软件系统由哪些模块组成,以及模块之间的调用关系
结构图的基本成分有:模块、调用和数据
*模块
模块(module):指具有一定功能的可以用模块名调用的一组程序语句,如函数、子程序等
它们是组成程序的基本单元
一个模块具有其外部特征和内部特征
- 外部特征包括:模块的接口(模块名、输入/输出参数、返回值等)和模块的功能
- 内部特征包括:模块的内部数据和完成其功能的程序代码
在SD中,我们只关注模块的外部特征,而忽略其内部特征
*调用和数据
调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者
为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块
数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示
结构图中的辅助符号
结构图的几个概念
深度:程序结构图中控制的层数,例如图中所示的结构图的深度是5
宽度:程序结构图中同一层次上模块总数的最大值,例如图中所示的结构图的宽度为7
扇出(fan out):该模块直接调用的模块数目。例如,例如图中模块M的扇出是4,模块A的是2,模块B的扇出是1
扇入(fan in):能直接调用该模块的模块数目。例如图中模块G的扇入是1,模块I的扇入是2,模块R的扇入是4
相关指标的含义
-
深度和宽度在一定程序上反映了程序的规模和复杂程度
相对而言,如果程序结构图的深度和宽度较大,则说明程序的规模和复杂程度都较大。
模块的扇入扇出会影响结构图的深度和宽度,例如减少模块的扇出,可能导致宽度变小而深度增加 -
一个模块的扇出过大通常意味着该模块比较复杂,然而扇出太少,可能导致深度的增加
一般情况,一个模块的扇出以3~9为宜 -
一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用(reuse)程度,因此模块的扇入越大越好
-
顶层扇出较高,中间扇出较少,低层模块高扇入
*结构化设计的步骤
- 建立初始结构图
将整个软件看作一个大的功能模块,通过功能分解不断将其分解成若干个较小的功能模块,直至得到一组不必再分解的模块(结构图中的底层模块) - 对结构图进行改进
可根据设计准则和启发式设计策略对初始结构图进行改进 - 书写设计文档
书写设计规格说明,特别要为每个模块书写模块的功能、接口、约束和限制等 - 设计评审
七、数据流图到软件体系结构的映射
-
结构化设计是将结构化分析的结果(数据流图)映射成软件的体系结构(结构图)
-
根据信息流的特点,可将数据流图分为变换型数据流图和事务型数据流图,其对应的映射分别称为变换分析和事务分析
-
信息流可分为两类:
变换流(transform)
事务流(transaction)
*变换型数据流图
- 变换型的DFD图可明显地分成输入、变换、输出三部分
- 信息沿着输入通路进入系统,并将外部形式转换成内部形式,进入系统的信息通过变换中心的处理,再沿着输出通路转换成外部形式后离开系统,具有这种特征的信息流称为变换流
- 变换型数据流(变换流):在基本系统模型中信息通常以“外部”所具有的形式进入系统,经过处理后又以这种形式离开系统。
*事务型数据流图
- 数据流沿着输入通路到达一个事务中心,事务中心根据输入数据的类型在若干条动作通路(action path)中选出一条来执行,具有这种特征的信息流称为事务流
- 事务中心的任务是:
- 接收事务(输入数据)
- 分析每个事务以确定它的类型
- 根据事务类型选取一条动作通路
其基本模型特征如下:
- 变换型数据流图举例
- 事务流设计模型举例
- 值得注意的是在大系统的数据流中,变换流和事务流往往交织在一起。如,在基于事务流的系统中,当信息沿动作路径流动时,可能呈现变换流的特征,因此,在具体进行面向数据流的软件设计时,两种方法交叉使用。
**数据流图映射到结构图的步骤
- 复审和精化数据流图
复审DFD的顶层图,确保系统的输入、输出数据流符合系统规格说明的要求
复审分层DFD,以确保它符合软件的功能需求
必要时对DFD进行精化。 - 确定数据流图的类型
根据DFD的信息流特征,确定DFD是变换型的还是事务型的 - 将DFD映射成初始结构图
采用变换分析或事务分析技术,将DFD映射成初始结构图 - 改进初始结构图
根据软件设计准则,采用启发式设计策略,对初始结构图进行改进,以改善软件质量
变换分析
1. 划定输入流和输出流的边界,确定变换中心
- 概念
物理输入:系统输入端的数据流
物理输出:系统输出端的数据流
逻辑输入:变换中心的输入数据流
逻辑输出:变换中心的输出数据流 - 物理输入要经过编辑、格式转换、合法性检查等辅助性加工后变成纯粹的逻辑输入再传给变换中心;变换中心产生的逻辑输出要经过格式转换、组成物理块、缓冲处理等辅助性加工后变成物理输出,再送到系统外
- 确定逻辑输入:
从物理输入端开始,一步步向系统的中间移动,可找到离物理输入端最远的,但仍可被看作系统输入的那个数据流,就是逻辑输入 - 确定逻辑输出:
从物理输出端开始,一步步向系统的中间移动,可找到离物理输出端最远的,但仍可被看作系统输出的那个数据流,就是逻辑输出 - 确定变换中心:
确定了所有的逻辑输入/输出后,位于逻辑输入和逻辑输出之间的部分就是变换中心
案例
- 例如,下图是考务处理系统中“统计成绩”子图经精化后的DFD,其中的虚线指出了输入流和输出流的边界。其中,“合格标准”既是物理输入,又是逻辑输入。
2. 进行第一级分解
- 第一级分解是将DFD映射成变换型的程序结构
主控模块:完成整个系统的功能
输入流控制模块:接收所有输入数据
变换流控制模块:对内部形式的数据进行加工处理,实现输入到输出的变换
输出流控制模块:产生所有输出数据
• 对大型系统可以将上述的一个模块画成多个模块(如每个输入/输出通路画一个模块)
• 分解的原则是在完成控制功能,并保持低耦合高内聚的前提下,尽量减少模块数
3. 进行第二级分解
输入流控制模块的分解:
从变换中心的边界开始,沿着输入通路向外移动,把输入通路上的每个加工映射成程序结构中输入流控制模块的一个低层模快
输出流控制模块的分解:
从变换中心的边界开始,沿着输出通路向外移动,把输出通路上的每个加工映射成程序结构中输出流控制模块的一个低层模快
变换流控制模块的分解:
把变换中心的每个加工映射成受变换控制模块控制的一个低层模块
程序结构的模块名称已隐含了模块的功能,但仍然有必要为每个模块写一个简要的处理说明,应该包括
模块的接口描述(进出模块的信息)
模块的局部信息(局部数据结构)
处理过程陈述,包括主要的判断点和任务;
约束和限制条件(对有关性质和一些特性的简要说明)
4.标注输入输出信息
第二级分解后得到软件的初始结构图。然后,根据DFD,在初始结构图上标注模块之间传递的输入信息和输出信息
事务分析
1. 确定事务中心
事务中心位于数条动作路径的起点,这些动作路径呈幅射状从该点流出
2. 将DFD图映射成事务型的程序结构
事务型的结构图如下图,其中:
1)主控模块:完成整个系统的功能
2)接收模块:接收输入数据(事务)
3)发送模块:根据输入事务的类型,选择一个动作路径控制模块
4)动作路径控制模块:完成相应的动作路径所执行的子功能
3.分解每条动作路径所对应的结构图
(1)接收模块的分解
从事务中心开始,沿着输入路径向外移动,把输入路径上的每个加工映射成结构图中受接收模块控制的一个低层模块
(2)动作路径控制模块的分解
首先确定每条动作路径的流类型(变换流或事务流),然后,运用变换分析或事务分析,将每条动作路径映射成与其流特性相对应的以动作路径控制模块为根模块的结构图
数据流图、系统流程图、程序流程图、软件结构图,他们之间有什么联系和区别?
系统流程图:反应主体框架
数据流程图:反应数据走向它不考虑时序关系,是业务分析用的,用作详细设计。图中的有向线段表示了数据流
程序流程图:程序逻辑描述程序中控制流的情祝,即程序中处理的执行顺序和执行序列所依赖的条件,图中的有向线段表示的是控制流从一个处理走到下一个处理
系统结构图:反映的是系统中模块的调用关系和层次关系谁调用谁有个先后次序时序关系。图中的有向线段表示调用时程序的控制从调用模块移到被调用模块,并隐含了当调用结束时控制将交回给调用模块
1.数据流图(Data Flow Diagram)
- 简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。它是描绘信息流和数据从输入移动到输出的过程中所经受的变换。
- 其主要元素有:→:数据流 □:数据源(终点) ○:对数据的加工(处理) 〓:数据存储
2. 系统流程图(System Flowchat〉
是描绘系统物理模型的传统工具。它的基本思想,是用图掰号以黑含子形式描绘系统里面的每个部件程序文件、数据库,表格、人工过程等),表挞信息在各个部件之间流动的情
况,而不是表标对信息进行加工处理的控过程
程序流程图
体系结构图
混合流
八、初始结构图的改进
1.减少模块间的耦合度
可以通过将功能简单的模块合并到与其关系密切的模块中,或调整模块的位置,来减少模块间的参数传递,或避免参数长距离传输,以降低耦合度。
2.消除重复功能
如果二个模块中存在某一相同的功能,应将这个功能从二个模块中分离出来,作为一个独立的模块被二者调用。
3.消除“管道”模块
“管道”模块通常是应该删除的,除非删除后上层模块的扇出太大。
4.模块的大小适中
如果一个模块太大,要考虑将它分成二个模块;如果一个模块太小,可考虑将它合并在与它功能密切相关的模块中。通常一个模块的大小,以其实现代码可书写在1~2页纸(约50~100行)为宜。
5.避免高扇出
一个模块的扇出不宜过大,一般希望控制在7±2范围内。当一个模块的扇出较大时,应考虑重新分解
6.应尽可能研究整张结构图,而不是只考虑其中的一部分
定货系统的软件结构设计
- Step-1 确定数据流图类型
该流图是典型的“三段”数据流图:输入、变换和输出,不存在明显的调度特性-------变换型数据流图。
- Step-2 确定输入数据流和输出流的边界,从而孤立变换中心
- Step-3 完成“第一级分解”
画出顶层控制模块以及输入、变换和输出的主控模块
- Step-4 完成“第二级分解”
- Step-5 优化
优化的原则:高内聚、低耦合。
合并“输入事务控制”与“输入事务”模块,减少模块数及控制关系,降低耦合;
合并“生成报表控制”与“产生报表”模块,同样减少模块数及控制关系,降低耦合;
- 最终的软件结构图如下:
小结
结构化方法是一种传统的面向数据流开发方法
以数据流为中心构建软件的分析模型和设计模型
在结构化分析方面,本章介绍结构化分析的基本思想和分析过程,详细介绍了分层数据流图的画法,分层数据流图的审查,数据字典各条目的描述内容以及基本加工小说明的描述方法
在结构化设计方面,本章介绍如何将分析的结果(DFD)映射成初始的程序结构图,包括变换分析和事务分析,并介绍对初始结构图的优化
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)