结构化分析方法的三位奠基人Tom DeMarco、Ed Yourdon和Chris Gane在上世纪七十年代末各自提出了同一种图形语言:用圆圈代表处理过程、用箭头代表数据流动、用双线代表外部实体、用开口矩形代表数据存储。四种简单图元组合在一起,就能把一个复杂的软件系统从最高层的抽象一直到最底层的细节逐层表达出来。
这就是数据流图的全部秘密。它的哲学基础是"自顶向下、逐层分解"——先画出系统与外部世界的边界,再逐步打开每一个加工,直到最底层的加工已经简单到不需要继续分解。
在软考系统分析师的考试大纲中,数据流图被明确列为需求分析阶段的核心工具。从2009年系统分析师首次单独开考至今,DFD题型从未缺席过任何一年案例分析。而软件设计师考试中,数据流图同样是下午题高频考点。它考察的远不止画图技巧,而是需求分析中最硬核的能力——从用户的只言片语中抽象出数据从哪里来、经过哪些处理、最终到哪里去的完整逻辑链。
数据流图的图元只有四种,但每一种都有严格的语义约束。如果仅仅把DFD理解成"用箭头把圆和方框连起来",在软考下午题中几乎必然会失分,因为命题人对四种图元的边界条件有非常精确的考察。
数据流用带箭头的实线表示,箭头的方向代表数据运动的方向。很多人学到考前才搞清楚的细节:数据流线上标注的必须是数据,不能是控制信号。例如"订单信息"是合法的数据流,而"开始处理"就不是——因为后者是控制指令而非数据传递。命题人经常用"发送审批通知"这类控制流来迷惑考生。
加工用圆形或圆角矩形表示,是系统中对数据进行变换的逻辑单元。加工的命名必须使用"动词加宾语"的结构,如"验证用户身份""计算运费",不能用名词命名。这个规则反映了加工的本质:对输入数据做某件事。
外部实体用矩形表示,代表系统边界之外的人、组织或其他系统。关键约束是:外部实体只能是数据的起点或终点,不能处理数据。画一条从"客户"直接到"数据库"的数据流就是错的——中间一定有一个加工。
数据存储用开口矩形或两条平行线表示,代表需要持久化保存的数据集合。命名必须是名词短语,如"订单表""客户档案"。数据存储只能被加工读写,外部实体不能直接访问——这是一个极高频率的考查点。
四种图元之所以能表达任意复杂度的系统,依靠的是"分层"机制。DFD的表达能力不看单张图上画了多少,而是看它通过多少层把细节逐步展开。顶层图越简洁越好,底层图越详尽越好,中间每一层恰好比上一层多揭示一层细节。
顶层图也叫上下文图,是DFD分层体系中最特殊的一张。整张图上只有一个加工,就是整个待建系统本身。其余图元都是外部实体及其与系统之间的数据流。
一张合格的顶层图应清楚回答三个问题:谁在使用这个系统?系统接收什么信息?系统输出什么信息?以软考常见的"图书管理系统"为例,顶层图上有读者、管理员、供应商三个外部实体及借书请求、还书确认、采购订单等数据流,但加工圆圈里只写四个字——"图书管理"。
顶层图最易被忽视的约束是平衡原则:顶层图上进出加工的所有数据流,必须在0层图中有对应的入边或出边,一条不能多一条不能少。命题人经常用"顶层图有但0层图没有"的数据流设计改错题。这个原则的本质是任何系统与外界的交互都必须在下一层分解中找到对应。
另一个易错点是顶层图上不允许出现数据存储。数据存储是系统内部实现细节,在只描述系统与外部关系的顶层图中不该出现。初学者容易下意识画出数据库,这会被直接判错。
如果说顶层图是站在系统外面往里看,0层图就是第一次走进去。加工从1个变成若干个,每个代表一个主要功能模块。数据存储开始出现,外部实体与顶层图完全一致。
0层图的编号规则是整个分层体系的基础:加工编号从1开始顺序编排如P1、P2、P3,数据流编号通常用F开头。每个加工都必须至少有一条输入和一条输出数据流——没有输入或没有输出的加工在逻辑上不可能存在。
系统分析师的分层DFD题目有固定模式:给出一段业务描述文字、一张不完整的顶层图和0层图,要求补齐缺失的数据流。解题思路有章可循:精读业务描述,标记每一个涉及数据传递的动词如"提交""发送""查询""更新";对照顶层图逐一核对每个外部实体的入流和出流;回到0层图检查加工间数据传递是否完整、加工与数据存储的读写关系是否完备。
贯穿所有DFD题目的核心原则是"数据守恒":处理输入所需数据必须在输入数据流中全部获得,产生输出所需数据必须由加工逻辑从输入数据中提取或生成。如果加工需要"客户信用等级"来判断是否批准订单,但进入该加工的数据流中没包含信用等级信息,这就违反了数据守恒——改错题中最常见的得分点。
0层图中每个加工都可以继续分解。以"订单处理"为例,它在1层图中可分解为"验证订单""检查库存""计算金额""生成配送单"四个子加工。子加工编号在父加工编号后加小数点,如P3分解为P3.1、P3.2、P3.3、P3.4。
分解的终点是"基本加工",即不需要也不能被继续分解的单元。判断标准有三:该加工可用一页以内文字描述清楚逻辑;输入输出数据流可明确列出且数量有限;内部逻辑不存在需
本篇完!