李成笔记网

专注域名、站长SEO知识分享与实战技巧

数据流图顶层图、零层图、子图的画法 - 程序员古德

数据流图的定义

数据流图(DFD),又称为数据流程图,是一种直观且易于理解的图形化工具,旨在帮助用户深入理解和分析系统的数据流转过程。通过剥离系统的物理属性,它精确地以逻辑方式描绘出系统的功能、输入源、输出目标以及数据存储等元素,因此,数据流图构成了系统逻辑模型中不可或缺的关键组成部分。

数据流图的基本图形

数据流图主要由四个基本图形元素构成:数据流(Data Flow)、加工(Process)、数据存储(Data Store)和外部实体(External Agent)。这些元素共同构建了软件系统内部的数据处理模型。其中,数据流表示数据的流动路径,加工代表对数据的处理操作,数据存储则用于描绘数据的存储环节。而外部实体,它代表了系统外部的对象,主要作用是辅助用户明确系统数据的来源以及最终流向,从而更全面地理解整个数据处理流程。DFD 的基本图形元素如下图所示。

数据流

数据流是由一组具有固定成分的数据所组成,它展示了数据在系统内部的流动方向和路径。在数据流图(DFD)中,数据流的流动可以呈现为以下几种模式:从某一加工环节流向另一加工环节;从加工环节流向数据存储环节(代表写入操作);从数据存储环节流向加工环节(代表读取操作);从外部实体流向加工环节(代表数据输入);以及从加工环节流向外部实体(代表数据输出)。

在DFD中,每一条数据流都有一个清晰明确的命名,这个命名需要能够准确反映该数据流的实质意义。需要注意的是,除了流向或流出数据存储的数据流可以不必命名外,其他所有的数据流都必须拥有一个贴切的名字。

此外,重要的是要明确DFD所描绘的是数据流,而非控制流。数据流可能由具体的数据属性(也被称作数据结构)所构成,或者也可能由其他数据流所组成。特别地,有一种名为组合数据流的数据流,它是由多个其他数据流所构成的,这样的设计使得在较高层次的数据流图中,可以将相似的数据流进行组合,从而提升数据流图的可读性。

加工

加工环节详细描述了数据从输入流到输出流所经历的转换过程,即输入数据流在经过何种处理后转变为输出数据流。每一个加工环节都被赋予一个独特的名字和编号。这个编号不仅表明了该加工环节在分层的数据流图(DFD)中所处的具体层次和位置,同时也揭示了它是由哪个上层加工分解而来的子加工。

一个加工环节可以接收多个输入数据流并产生多个输出数据流,但至少要有一个输入数据流和一个输出数据流来保证其基本功能的实现。

数据存储

加工环节详细定义了输入数据流到输出数据流之间的转换过程,即输入数据流如何经过特定处理变成输出数据流。每个加工环节都有其独特的名称和编号。这个编号不仅指示了加工环节在分层数据流图(DFD)中的层次和位置,还指明了它是哪个上层加工分解得出的子加工。

每个加工环节都能接受多个输入数据流,并生成多个输出数据流,但最少也需要有一个输入数据流和一个输出数据流,以确保其基本功能的实现。

数据存储则负责在系统中保存数据。在数据流通过加工环节处理后,原始数据流可能会消失,但其部分或全部数据可能被转化为新的输出数据流,流向其他加工环节或外部实体。然而,在软件系统中,我们还需要将某些信息保存下来以备后用,这时就需要使用数据存储。例如,在考务处理系统中,随着报名过程的进行,考生名册会不断补充更新,而在统计成绩和制作考生通知书时,这些考生信息仍然需要被使用。因此,考生名册可以作为一个数据存储存在,确保考生信息的持续可用性。

每个数据存储都配有一个明确的名称来标识。数据存储可以接受数据流入,表示数据写入操作;也可以让数据流出,代表数据的读取操作;同时,还可能通过双向箭头表示对数据进行的修改操作。

需要指出的是,DFD中的数据存储在具体实现时,可以采用文件系统或数据库系统等多种方案。而其存储介质也可以是磁盘、磁带或其他适合的存储设备。

外部实体(外部主体)

外部实体指的是位于软件系统外部的人员或组织,这些实体扮演着系统数据源头(源)和数据终点(宿)的角色。以考务处理系统为例,考生通过提交报名单(输入数据流)为系统提供数据,因此考生在这里被视为数据的源;同时,系统会将考生成绩的统计分析表(输出数据流)发送给考试中心,所以考试中心则作为数据的宿。

在众多系统中,某一数据的源和宿有可能由同一人员或组织担任。在这种情况下,数据流图(DFD)中可以使用相同的符号来表示。以考务处理系统为例,考生不仅向系统提交报名单,同时还会从系统接收准考证,因此在这个系统中,考生同时充当了数据源和数据宿的角色。

源和宿在数据流图中使用相同的图形符号来表示。当数据流从该符号流出时,表明它充当数据源;当数据流流向该符号时,表示它作为数据宿;若两种情况同时存在,则说明它既是数据源又是数据宿。

数据流图的层次结构

虽然从理论上讲,一张足够大的纸张可以承载一个软件系统的完整分析模型,但实际操作中,复杂软件系统的复杂性通常难以在单张图中清晰展现。这样的系统可能包含数百个加工和数据流,如果尝试将所有内容绘制在同一张图上,不仅会导致图表变得极度复杂,还会降低其可读性和可理解性。

为了解决这个问题,我们采用了自顶向下、逐层分解的绘制方法。通过将数据流图划分为多个层次,并将每个层次中的加工数量控制在“7加减2”的合理范围内,我们可以构建出一套分层的数据流图。这种分层的方法有助于我们更加清晰地呈现软件系统的各个部分及其之间的交互关系。

层次结构

分层数据流图的顶层是唯一的,仅包含一张图表,其中有一个加工元素,这个加工代表了整个软件系统。这个加工描绘了软件系统与外部环境之间的数据流交换,我们称之为顶层图。

当顶层图中的加工(即整个系统)被进一步分解后,我们得到的图表被称为0层图,这样的图表也只有一张。在分层数据流图的结构中,位于最底层的图表被称为底层图。在底层图中,所有的加工都已经达到了最细粒度,不再进行进一步的分解。

分层数据流图中的其他层级被称为中间层。在这些层级中,至少有一个加工(也有可能是全部加工)会被进一步分解成子图。在整个分层数据流图体系中,那些不再被分解成子图的加工被定义为基本加工。

图和加工的编号

首先,我们需要明确父图与子图的概念。当某图(我们称之为A图)中的一个加工被进一步细化为另一张子图(称为B图)时,A图即被视为B图的父图,相应地,B图则是A图的子图。值得注意的是,如果父图中包含n个加工,那么它最多可以派生出n张子图,且每一张子图都唯一对应其父图。

为了更有效地管理和检索这些图表,我们采用以下方式对数据流图(DFD)中的图和加工进行编号:

① 顶层图中仅包含一个加工,它代表整个软件系统,因此这个加工不需要编号。 ② 在0层图中,各个加工的编号依次为1、2、3……。 ③ 子图的编号直接采用其父图中被分解的加工号。 ④ 对于子图中的加工编号,如果父图中的某个加工(编号为x)被分解为子图,则该子图中的加工将依次编号为x.1、x.2、x.3……。这样的编号方式有助于我们清晰地追踪和理解各个加工及其子加工之间的关系。

数据流图的画图步骤

下面以某考务处理系统为例介绍分层数据流图的画法,考务处理系统的功能需求如下:

  1. 对考生送来的报名单进行检查。
  2. 对合同的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站。
  3. 对阅卷站送来的成绩清单进行检查,并根据考试中心指定的合格标准审定合格者。
  4. 制作考生通知单(内含成绩合格/不合格标志)送给考生。
  5. 按地区、年龄、文化程度、职业和考试级别等进行成绩分类统计和试题难度分析,产生统计分析表。

部分数据流的组成如下:

  1. 报名单=地区+序号+姓名+文化程度+职业+考试级别+通讯地址
  2. 正式报名单=准考证号+报名单
  3. 准考证=地区+序号+姓名+准考证号+考试级别+考场
  4. 考试名单={准考证号+考试级别}(其中,{w}表示w重复多次)
  5. 考生名册=正式报名单 统计分析表=分类统计表+难度分析表
  6. 考生通知单=准考证号+姓名+通讯地址+考试级别+考试成绩+合格标志

先画顶层图

顶层图主要用于描述软件系统的输入与输出,它详细说明了系统从哪些外部实体获取数据流,以及系统将数据流发送至哪些外部实体。

在顶层图中,通常只有一个加工,这个加工即代表整个待开发的软件系统。

这些在顶层图中呈现的数据流,实际上构成了系统的输入/输出信息,但是需要注意,顶层图中通常不包含数据存储的元素。

某考务处理系统的顶层入下图所示:

再拆分加工

在这一步中就是画0层图

0层图是通过将顶层图中的唯一加工分解成多个加工而构建的。

这些分解后的加工通过数据流相互连接,确保顶层图中的输入数据能够经过这一系列加工的处理,最终转化为顶层图的输出数据流。

因此,从单一加工派生出一张完整的数据流图,实际上就是对这一加工的详细分解过程。

如下图,将顶层图中“考务处理系统”拆分以后得结构:

如何确定加工

“加工”指的是从父图中的某个加工分解而来的子加工,我们可以采用以下两种方法来确定这些子加工:

  1. 基于功能分解来确定加工:每个加工实质上代表了系统的一种特定功能。根据功能分解的原理,我们可以将一个复杂的功能拆解成若干个更小的功能单元,而这些较小的功能单元就是分解后得到的子加工。这种方法在高层数据流图(DFD)的加工分解中特别适用。
  2. 根据业务流程来确定加工:通过深入分析父图中待分解加工的业务处理流程,我们可以发现,流程中的每一个环节都有可能成为一个独立的子加工。在此过程中,需要特别关注业务流程中数据流发生变化或数据流值发生更改的地方,这些变化点通常意味着存在一个加工过程,该过程负责将原始数据流(作为此加工的输入数据流)转换为变化后的数据流(作为此加工的输出数据流)。这种方法在低层数据流图的加工分解中更为常用,因为它能够详细描绘从父加工的输入数据流到输出数据流之间的具体处理细节。

如何确定数据流

当用户将一组数据视为一个不可分割的单元进行处理,即这些数据同时到达并经历相同的处理流程时,我们可以将这些数据视为一个数据流。在现实工作场景中,表单经常作为一种数据流的形式出现。

在父图(高级流程图)的某个加工步骤被分解为子图(更详细的流程图)时,父图中对应加工的输入/输出数据流即转化为子图边界上的输入/输出数据流。

除此之外,在分解后的子加工之间,需要增加一些新的数据流来代表加工过程中的中间数据,这些数据流体现了对某子加工输入数据流的变动。它们与所有子加工共同协作,实现了父图中对应加工从输入数据流到输出数据流的转换。当需要保留某些中间数据以供后续使用时,这些数据流可以表示为流向数据存储的部分。

值得注意的是,即使同一个数据源或加工可能有多条数据流流向另一个加工,如果这些数据流不是同步到达和处理的,那么它们应当被视为独立的数据流。同样地,一个加工也可以有多条数据流流向不同的加工或终点(宿)。

如何确定数据存储

当我们根据父图中的某个加工来绘制其子图时,需要注意数据流的继承关系。如果父图中的加工与数据存储之间存在数据流——无论是向数据存储写入数据(写操作),还是从数据存储中读取数据(读操作)——这些数据存储和相关的数据流都应当在子图中体现出来。

在构建子图的过程中,若有必要保存某些中间数据以备后用,我们可以考虑将这些数据整合成一个新的文件。在自上而下地构建分层数据流图时,每个新创建的数据存储(即在图中首次出现的)都应至少有一个加工负责向其写入数据,并且至少有另一个加工能从该数据存储中读取数据。

值得注意的是,对于从父图继承而来的数据存储,在子图中可能只会涉及到其读取或写入操作的其中之一。

如何确定源和宿

在将父图中的某个加工分解为子图的过程中,如果该父图加工涉及与数据存储的交互,包括将数据写入数据存储(写操作)或从数据存储读取数据(读操作),则这些数据存储以及与它们相关的数据流都应在子图中进行表示。

当在子图中需要长期保留某些中间数据时,可以将这些数据组织成一个新的数据文件。在自顶向下绘制分层数据流图的过程中,新引入的数据存储(首次出现)必须至少有一个加工负责向其中写入数据记录,同时还应至少存在另一个加工用于读取该数据存储中的记录。

值得注意的是,对于从父图中继承而来的数据存储,在子图中可能仅执行读取或写入操作,具体取决于该数据存储在子图处理流程中的角色和需要。

画加工的内部

在数据流图(DFD)中,如果遇到某个尤为复杂的加工环节,我们有一种有效的处理方式:将其拆解为一张DFD子图。这个拆解的过程,其实质就是将这个加工环节视作一个独立的小系统。这个小系统的输入输出数据流,便是原先那个复杂加工的输入输出数据流。之后,我们可以借鉴绘制0层图的方法,细致地构建出这个加工环节的子图。通过这种方式,我们能够更加清晰地理解和分析这个复杂加工环节,为系统设计和优化提供便利。

下面介绍考务处理系统0层图中加工1的分解,这里根据业务处理流程来确定加工1的分解。

分析考务处理系统的功能需求和0层图,将加工1分解成3个子加工:检查报名表、编准考证号和登记考生。加工1分解而成的子图如下图所示。

采用同样的方法画出加工 2 分解的 DFD 子图,如下图所示。

重复第3)步的分解,直到图中尚未分解的加工都足够简单(也就是说,这种加工不必再分解)。 这里假设上图中的每个加工都已经足够简单,不需要再分解,该考务处理系统的分层DFD绘制工作结束。

案例分享

案例1

顶层图

零层图

子图

案例2

顶层图

零层图

案例3

顶层图

领层图

子层图

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言