数据流图-1(DFD基本组成)
数据流图(Data Flow Diagram,简称DFD) 是一种最常用的结构化分析工具,它从数据传 递和加工角度,以图形的方式刻画系统内的数据运动情况。
数据流图中具有四种基本成分,如图1.3所示。
图1.3 数据流图的基本成分及其表达符号
数据流表示数据的流动情况;加工表示对数据的加工处理过程,它的名字应能简明扼要地表明所完成的是什么加工;数据存贮在数据流图中起着保存数据的作用,指向数据存贮的数据流可以理解为写数据,从数据存贮引出的数据流可以理解为读数据,双向数据流可以理解为修改数据;数据源点或终点,表示图中出现数据的始发点或终止点,它在图中的出现仅仅是一种符号,并不需要以软件的形式进行设计和实现。
在数据流图中,如果有两个以上数据流指向一个加工或从一个加工中引出,则这些数据流之间往往存在一定的关系。我们通常用图1.4所示符号表示这种关系。
图1.4 多个数据流与加工关系的表示
在画数据流图时,如下几个问题值得注意:
1)是画数据流图而不是画程序框图
对于很多人来说,通过学习计算机语言已经比较熟悉程序框图了,在画数据流图时很容易将它们搞混。程序框图是从对数据进行加工的角度描述系统的,其箭头是控制流,表示的是对数据进行加工的次序,它用于描述怎样解决问题;数据流图则是从数据的角度来描述系统的,其箭头是数据流,表示的是数据的流动方向,它用于描述是什么问题。
2)数据流及加工的命名
通常是先为数据流命名,然后再为加工命名。在给数据流命名时,应避免使用象“数据”、“输入”之类的缺乏具体含义的名字;在给加工命名时,理想的做法是取由一个具体的及物动词加一个具体的宾语构成的名字,如果必须用两个动词,则可以考虑将这个加工再分解成两个加工。在命名时,所取的名字应适合整个数据流或加工,而不是仅仅反映它的某些成分。如果发现某个数据流或加工难以命名,那么很可能是数据流图分解不当造成的,此时应该考虑重新分解数据流图。
数据流图-2(分层数据流图)
对于比较复杂的实际问题,在数据流图上常常出现十几个乃至几十个、上百个加工,这样的数据流图看起来很不清楚。采用层次结构的数据流图则能很好地解决这个问题。
如图中的系统S
图1.5 系统加工数据流图
它的输入输出反映了系统与外界环境的关系或接口,仅用这个图是不能表明数据的加工要求的,需要进一步细化。如果S可以分解成三个子系统S1、S2、S3,则可画出它们加工及其相关的数据流。子系统S1又可以进一步细化为S1.1、S1.2、S1.3,等等,如图1.6所示。
图1.6 分层数据流图
按照这种方法对系统进行自顶向下的逐步细化和分层分解,并以分层的数据流图反映这种结构关系,就能比较清楚地表达和容易地理解整个系统。在画分层数据流图应考虑如下几个问题:
1) 编号
为便于管理和阅读,要对每个层次上的图及其加工进行编号。层次编号自上而下分别为顶层图(系统图)、0层图、1层图、等等。各层图的关系为父子关系,下层图为子图,上层图为父图。子图的编号就是其父图中相应加工的编号;子图中加工的编号由子图号、小数点和局部号组成。在这种编号中,图号中的小数点的个数就是该图所在的层次号,最后一个小数点前的号码就是其父图的编号。例如,编号为3.2.1的图,是2层图中的一个子图,其父图编号为3.2。
2)父图和子图的数据平衡
子图是父图的细化,因此,子图的输入、输出数据流应和父图中相应加工的输入、输出数据流一致。
3)分解的程度
对一个加工进行细化分解,一次分解成两个或三个加工,可能需要的层次过多;但分解得过多又难于让人理解。根据心理学的研究成果,人们能有效地同时处理问题的个数不超过7个 。因此,一个加工每次分解细化出的子加工个数一般不要超过7个。当所分解出的子处理已十分简单时,就可停止这种分解过程。
4)图表格式
对于一个较大的系统来说,其数据流图可能多达十几张、几十张,一般都将它们装订成册。为了方便收集、整理和阅读,可以设计一个类似图1.7所示的图表进行格式化。其中,假设 大学教务管理系统是大学教学管理系统0层数据流图中的第2个子加工,是1层数据流图中的一 个子图。
图1.7 数据流图图表格式
数据流图-3(数据词典)
尽管数据流图给出了系统数据流向和加工等情况,但其各个成分的具体含义仍然不清楚或不明确,因此,在实际中常采用数据词典这一基本工具对其作进一步的详细说明。
数据词典(Data Dictionary,简称DD)和数据流图密切配合,能清楚地表达数据处理的要求 。数据词典用于对数据流图中出现的所有成分给出定义,它使数据流图上的数据流名字、加工名字和数据存贮名字具有确切的解释。每一条解释就是一条词条,按一定的顺序将所有词条排列起来,就构成了数据词典,就象日常使用的英汉词典、新华词典一样。
数据词典包括数据流、数据存贮和加工等条目类型,下面分别介绍它们的表示方法。
1)数据流表示
采用自上而下、逐层分解的方式对每一条数据流进行定义。在数据流的定义式中,通常采用下述符号:
= 被定义为
+ 与
m· · n 界域
[...,...] 或,选择括号内的某一项
[...|...] 或,选择括号内的某一项
{...} 重复,花括号内的项多次重复出现,重复次数的上、下限也可在括 号边上标出
(...) 可选,圆括号内的项可出现也可不出现
"..." 引号内给出的是基本数据元素,它们无需进一步定义
以大学教务管理问题数据流图中的数据流的定义为例:
(D01) 学生证=学号+密码
(D02) 申请单=学号+(课程号+选课学期)
(D03) 谢绝=["非法证件"|"不合格单"|"证单不符"]
(D04) 注册=学号
(D05) 选课=学号+课程号+选课学期
(D06) 无此课=学号+课程号+"无此课"
(D07) 注册记录无效=学号+"注册无效"
(d01.1) 学号="00000001".."99999999"
(d01.2) 密码="000001".."999999"
(d02.2) 课程号=1{"英文字母"}4+"0001".."9999"
(d02.3) 选课学期="0001".."9999"+["春季"|"秋季"]
2)数据存贮表示
有两种类型的数据存贮,一种是文件形式,另一种是数据库形式。对于文件形式,其定义包括定义文件的组成数据项和文件的组织方式两项内容,其中文件组成数据项的定义方式与数据流的定义方式相同。例如,某图书馆借书系统数据流图中的文件的定义为:
文件组成数据项
(F1) 借书记录={证号+姓名+书号+书名 +借书日期 }
(F2) 库存书目={书号+书名+"库存总数"+"现库存数"}
(F1.5) 借书日期=日期
文件组织方式:
借书记录=按借书日期先后排列
库存书目=按书名先后排列
对于数据库形式,我们将在1.3节专门讨论。
3)加工表示
数据词典中只需列出基本加工的定义即可,因为任何一个加工最后总能分解成一些基本加工,只要有了基本加工的定义,就可以理解其它加工。
加工的定义又称为小说明,它集中描述一个加工做什么,也可包括一些与加工有关的信息,如执行条件、优先次序、执行频率和出错处理等。目前小说明采用如下几种方式描述。
1)结构化语言
用结构化语言描述小说明的形式如下:
加工编号:在数据流图中的编号
加工名:在数据流图中的加工名字
加工逻辑:本加工的处理方法说明
有关信息:执行条件等
例如,大学教务管理问题中的加工定义如下。
加工编号:2.1
加工名: 检验
加工逻辑:读入“学生证”及“申请单”,检验“学生证”的有效性和“申请单”的合格性,如果检验均通过则让“申请单”通过,否则输出“谢绝”。
加工编号:2.2
加工名: 审查接受申请
加工逻辑:根据传送过来的“申请单”审查申请人的以往注册记录,如果审查通过则根据申请内容区分不同的申请事务,否则输出“注册记录无效”。
加工编号:2.3
加工名:注册登记
加工逻辑:为申请人进行本次注册登记。
有关信息:每学期开学注册时间内执行此加工。
加工编号:2.4
加工名:检索课程
加工逻辑:根据“申请单”检索课程开设情况,如果有满足要求的课程则让“选课”通过,否则输出“无此课”。
有关信息:每学期开学选课时间内执行此加工。
加工编号:2.5
加工名:选课登记
加工逻辑:为申请人进行选课登记和选课单打印。
有关信息:每学期开学选课时间内执行此加工。
2)判定表
判定表用于描述一些结构化语言不易表达清楚的加工逻辑。例如,旅游票预订系统中,在旅游旺季7~9月份、12月份,如果订票超过50张,则优惠票价的15%;50张以下,优惠5%。 在旅游淡季1~6月份、10月份和11月份,若订票超过50张,优惠30%;50张以下,则只优惠20%。用语言表达显得罗嗦,如果用表1.1所示的判定表形式表示,则简单明了,如表1.2所示。
表1.1 判定表一般结构
条件名 |
(条件项) |
...... |
(条件项) |
...... |
|
|
|
条件名 |
(条件项) |
...... |
(条件项) |
操作名 |
(操作项) |
...... |
(操作项) |
...... |
|
|
|
操作名 |
(操作项) |
...... |
(操作项) |
表1.2 旅游预订票系统判定表
旅游时间 |
7~9月,12月 |
1~6月,10月,11月 |
|||
订票量 |
<=50 |
>50 |
<=50 |
>50 |
|
折扣量 |
5% |
15% |
20% |
30% |
|
3)判定树
判定树以图形方式描述加工逻辑,它结构简单,易读易懂。例如上面的判定表,若用判定树来表示就很清晰,如图1.8所示。
图1.8 旅游预订票系统的判定树
加工逻辑可以用结构化语言、判定表、判定树等多种形式表示,也可将它们结合起来表示。