3.3.2. 成分的命名
数据流图中每个成分的命名是否恰当,直接影响数据流图的可理解性。在命名时应注意的问题:
为数据流(或数据存储)命名
(1)名字应代表整个数据流(或数据存储)的内容,而不是仅仅反映它的某些成分;
(2)不要使用空洞的、缺乏具体含义的名字(如"数据"、“信息”、"输入"之类);
(3)如果在为某个数据流(或数据存储)起名字时遇到了困难,则很可能是因为对数据流图分解不恰当造成的,应该试试重新分解,看是否能克服这个困难。
为处理命名
(1)通常先为数据流命名,然后再为与之相关联的处理命名。这样命名比较容易,而且体现了人类习惯的"由表及里"的思考过程。
(2)名字应该反映整个处理的功能,而不是它的一部分功能;
(3)名字最好由一个具体的及物动词加上一个具体的宾语组成。应该尽量避免使用"加工"、"处理"等空洞笼统的动词作名字;
(4)通常名字中仅包括一个动词,如果必须用两个动词才能描述整个处理的功能,则把这个处理再分解成两个处理可能更恰当些。
(5)如果在为某个处理命名时遇到困难,则很可能是发现了分解不当的迹象,应考虑重新分解。
为数据源点/终点命名
数据源点/终点并不需要在开发目标系统的过程中设计和实现,它并不属于数据流图的核心内容,只不过是目标系统的外围环境部分(可能是人员、计算机外部设备或传感器装置)。通常,为数据源点/终点命名时采用它们在问题域中习惯使用的名字(如"采购员"、"仓库管理员"等)。
3.4. 数据流图的例子
假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。
对于每个需要再次订货的零件应该列出下述数据:零件编号、零件名称、订货数量、目前价格、主要供应者、次要供应者。
零件入库或出库称为事务,通过放在仓库中的CRT终端把事务报告给订货系统。当某种零件的库存数量少于库存量临界值时就应该再次订货。
按步骤对题干进行分析,提取数据流图的四种成分:
首先考虑数据的源点和终点,从上面对系统的描述可以知道"采购部每天需要一张订货报表",“通过放在仓库中的CRT终端把事务报告给订货系统”,所以采购员是数据终点,而仓库管理员是数据源点。
这其中必须有一个用于产生报表的处理。事务的后果是改变零件库存量,然而任何改变数据的操作都是处理,因此对事务进行的加工是另一个处理。注意,在问题描述中并没有明显地提到需要对事务进行处理,但是通过分析可以看出这种需要。
系统把订货报表送给采购部,因此订货报表是一个数据流;事务需要从仓库送到系统中,显然事务是另一个数据流。产生报表和处理事务这两个处理在时间上明显不匹配一每当有一个事务发生时立即处理它,然而每天只产生一次订货报表。因此,用来产生订货报表的数据必须存放一段时间,也就是应该有一个数据存储。
在弄清楚数据流图的成分之后,就开始画数据流图了,首先画出一个顶级数据流图:
从基本系统模型这样非常高的层次开始画数据流图是一个好办法。在这个高层次的数据流图上是否列出了所有给定的数据源点和终点是一目了然的,因此它是很有价值的通信工具。
下一步应该把基本系统模型细化,描绘系统的主要功能。“产生报表"和"处理事务"是系统必须完成的两个主要功能,它们将代替图的"定货系统”,如下面的一级数据流图:
接下来应该对功能级数据流图中描绘的系统主要功能进一步细化。
考虑通过系统的逻辑数据流:当发生一个事务时必须首先接收它;随后按照事务的内容修改库存清单;最后如果更新后的库存量少于库存量临界值时,则应该再次定货,也就是需要处理定货信息。
因此,把"处理事务"这个功能分解为"接收事务"、"更新库存清单"和"处理定货"三个步骤,这在逻辑上是合理的,如下面的二级数据流图所示。
至此,一个详细的数据流图才算画完了。
当用数据流图辅助系统的设计时,以图中不同处理的定时要求为指南,能够在数据流图上画出许多组自动化边界,每组自动化边界可能意味着一个不同的物理系统,因此可以根据系统的逻辑模型考虑系统的物理实现。
例如,事务随时可能发生,因此处理1.1(“接收事务”)必须是联机的;采购员每天需要一次定货报表,因此处理2(“产生报表”)应该以批量方式进行。问题描述并没有对其他处理施加限制。对 L 2 L2 L2划分自动化边界的结果如下图所示:
3.4. 数据流图的分层
以上绘制数据流图的步骤可以用下面这张分层数据流图来表示,首先绘制最上面一层的顶级数据流图 L 0 L0 L0,然后是第二层的一级数据流图 L 1 L1 L1,再是最下面的二级数据流图 L 2 L2 L2,理论上还可以画出 L 3 L3 L3、 L 4 L4 L4等等。
如果要产生详细的数据流图就要把所有加工处理都分解成基本加工,所谓基本加工,就是数据流图中所有不能进一步分解的加工,一般有父项、无子项的加工就是基本加工。
3.5. 基本加工说明 PSPEC
PSPEC用来说明DFD中的每个基本加工
可以用的描述工具有:结构化语言、决策树、决策表、盒图、数学公式等等
其中结构化语言也叫作伪代码或者过程设计语言,其介于自然语言和计算机语言之间,通过顺序语句、条件语句和循环语句对基本加工进行描述,例如:
IF 发货单金额超过$500 THEN IF 欠款超过60天 THEN 在偿还欠款前不予批准 ELSE 欠款未超期 发批准书及发货单 ENDIF ELSE 发货单金额未超过$500 IF 欠款超过60天 THEN 发批准书、发货单及催款通知 ELSE 欠款未超期 发批准书及发货单 ENDIF ENDIF
决策树是一种图形工具,适合于描述加工中具有多个策略,而且每个策略和若干条件有关的逻辑功能,例如:
决策表的内涵与决策树一致,但是适用于如果判断的条件较多,各条件又相互组合的情况,如下表所示:
4. 数据字典 Data Dictionary,DD
4.1. 数据字典的概念
数据字典是对数据流图中包含的所有元素的定义的集合。它是分析阶段的交流工具,也是数据库设计的基础。在结构化系统分析中,数据字典是分析的核心。
任何字典最主要的用途都是供人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。数据流图和数据字典共同构成系统的逻辑模型,没有数据字典数据流图就不严格,然而没有数据流图数据字典也难于发挥作用,它们两个要放在一起才能发挥作用。
4.2. 数据字典的内容
一般说来,数据字典应该由对下列五类元素的定义组成:
数据流
数据元素(字段)
数据存储(表)
加工处理
外部项
但是,对于数据处理,用其他工具描述更方便,通常是使用IPO图或PDL。
典型的情况是,在数据字典中记录数据元素的下列信息:
一般信息,名字、别名、描述等等;
定义,数据类型、长度、结构等等;
使用特点,值的范围、使用频率、使用方式(输入、输出、本地)、条件值等等;
控制信息,来源、用户、使用它的程序、改变权、使用权等等
分组信息,父结构、从属结构、物理位置记录、文件和数据库等等。
4.3. 定义数据的方法
数据是通过下面五种运算符由数据元素:
顺序连接 + + +,即以确定次序连接两个或多个分量;
选择 [ ∣ ] [|] [∣],用于从两个或多个可能的元素中选取一个;
重复 { } n \{\}n {}n,用于把指定的分量重复 n n n次;
可选 ( ) () (),即一个分量是可有可无的(重复零次或一次);
定义为 = = =,用于最终确定一个数据;
例如:
学生成绩通知= { \{ {学号+姓名+ { \{ {课程名称+成绩 } \} }+(补考课程名称+补考时间+补考地点) } \} }所有注册学生
学生奖励通知= { \{ {学号+姓名+[一等奖 | 二等奖 | 三等奖] } \} }所有获奖学生
4.4. 数据字典的实现
目前,数据字典几乎总是作为CASE"结构化分析与设计工具"的一部分实现的。在开发大型软件系统的过程中,人工维护数据字典几乎是不可能的。
如果在开发小型软件系统时暂时没有数据字典处理程序,建议采用卡片形式书写数据字典,每张卡片上主要应该包含下述这样一些信息:名字、别名、描述、定义、位置。
例如下面就是一张描绘数据流的数据字典卡片:
5. 成本/效益分析
5.1. 成本估算
成本/效益分析的目的正是要从经济角度分析开发一个特定的新系统是否划算,从而帮助客户组织的负责人正确地作出是否投资于这项开发工程的决定。
为了对比成本和效益,首先需要估计它们的数量。软件开发成本主要表现为人力消耗(乘以平均工资则得到开发费用)。当然成本估计不是精确的科学,因此应该使用几种不同的估计技术以便相互校验。下面简单介绍3种估算技术。
代码行技术
代码行技术是比较简单的定量估算方法,它把开发每个软件功能的成本和实现这个功能需要用的源代码行数联系起来。估计出源代码行数以后,用每行代码的平均成本乘以行数就可以确定软件的成本每行代码的平均成本主要取决于软件的复杂程度和工资水平。
任务分解技术
这种方法首先把软件开发工程分解为若干个相对独立的任务,再分别估计每个单独的开发任务的成本,最后累加起来得出软件开发工程的总成本估计每个任务的成本时。通常先估计完成该项任务需要用的人力(以人月为单位),再乘以每人每月的平均工资而得出每个任务的成本。
自动估计成本技术
采用自动估计成本的软件工具可以减轻人的劳动,并且使得估计的结果更客观。但是,采用这种技术必须有长期搜集的大量历史数据为基础,并且需要有良好的数据库系统支持。
5.2. 成本/效益分析方法
成本/效益分析的第一步是估计开发成本、运行费用和新系统将带来的经济效益。
其中,运行费用取决于系统的操作费用(操作员人数,工作时间,消耗的物资等等)和维护费用;系统的经济效益等于因使用新系统而增加的收入加上使用新系统可以节省的运行费用。
因为运行费用和经济效益两者在软件的整个生命周期内都存在,总的效益和生命周期的长度有关,I 所以应该合理地估计软件的寿命。为了保险起见,在进行成本/效益分析时一律假设生命周期为5年。
在以上条件的基础上,可以从四个方面来考虑对成本/效益进行分析:
货币的时间价值
投资回收期
所谓投资回收期就是使累计的经济效益等于最初投资所需要的时间。
纯收入
纯收入就是在整个生命周期之内系统的累计经济效益(折合成现在值)与投资之差。这相当于比较投资开发一个软件系统和把钱存在银行中这两种方案的优劣。
投资回收率
把资金存入银行或贷给其他企业能够获得利息,通常用年利率衡量利息多少。类似地也可以计算投资回收率,用它衡量投资效益的大小,并且可以把它和年利率相比较,在衡量工程的经济效益时,它是最重要的参考数据。
5.2.1. 货币的时间价值
通常用利率的形式表示货币的时间价值。假设年利率为 i i i,如果现在存入 p p p元,则 n n n年后可以得到的钱数为:
F = p ( 1 + i ) n F=p(1+i)^n
F=p(1+i)
n
这也就是 p p p元钱在 n n n年后的价值。反之,如果 n n n年后能收入 F F F元钱,那么这些钱的现在价值是
p = F ( 1 + i ) n p=\frac{F}{(1+i)^n}
p=
(1+i)
n
F
例如,修改一个已有的库存清单系统,使它能在每天送给采购员一份订货报表。修改已有的库存清单程序并且编写产生报表的程序,估计共需5000元; 系统修改后能及时订货,这将消除零件短缺问题,估计因此每年可以节省2500元,5年共可节省12500元。
但是,不能简单地把5000元和12500元相比较,因为前者是现在投资的钱,后者是若干年以后节省的钱。假定年利率为12%,利用上面计算货币现在价值的公式可以算出修改库存清单系统后每年预计节省的钱的现在价值,如下表所示。