面向数据流的设计方法总述
面向数据流的设计方法定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构。
因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法),也就是基于数据流的设计方法。
一、概念
面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。
信息流有两种类型:
1、变换流
信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。

2、事务流
数据沿输入通路到达一个处理T,T根据输入数据的类型在若干个动作序列中选出一个来执行。处理T称为事务中心,它完成下述任务:
■接收输入数据;
■分析每个事务以确定它的类型;
■根据事务类型选取一条活动通路。

3、设计过程
![7X}P_%IQ]P@84)FEFWXZ7~R.png](https://p.ananas.chaoxing.com/star3/origin/290c8cb919598c304e7086211b4ecbe4.png)
二、变换分析
变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。
设计步骤:
(1) 复查基本系统模型
确保系统的输入数据和输出数据符合实际。
(2) 复查并精化数据流图
对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。
不仅要确保数据流图给出了目标系统的正确的逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。
(3) 确定数据流图具有变换特性还是事务特性
一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。确定数据流的全局特性和局部特性。
(4) 确定输入流和输出流的边界,从而孤立出变换中心
输入流和输出流的边界和对它们的解释有关,不同设计人员可能会在流内选取稍微不同的点作为边界的位置。
(5) 完成“第一级分解”
位于软件结构最顶层的控制模块Cm协调下述从属的控制功能:
■输入信息处理控制模块Ca,协调对所有输入数据的接收;
■变换中心控制模块Ct,管理对内部形式的数据的所有操作;
■输出信息处理控制模块Ce,协调输出信息的产生过程。

(6) 完成“第二级分解”
处理映射成软件结构中一个适当的模块。完成第二级分解的方法是:
■从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;
■然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;
■最后把变换中心内的每个处理映射成受Ct控制的一个模块。


(7) 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化
为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,为了得到一个易于实现、易于测试和易于维护的软件结构,应该对初步分割得到的模块进行再分解或合并。
三、事务分析
虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。
事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同:
■由事务流映射成的软件结构包括一个接收分支和一个发送分支;
■映射出接收分支结构的方法和变换分析映射出输入结构的方法很相像,即从事务中心的边界开始,把沿着接收流通路的处理映射成模块;
■发送分支的结构包含一个调度模块,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。

例子
设计一个产品,它将一个文件名作为输入,并返回文件中的字数。




总结:
一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。
机械地遵循变换分析或事务分析的映射规则,可能会得到一些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。
如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。
四、设计优化
设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单的数据结构。
对于时间是决定性因素的应用场合,可能有必要在详细设计阶段,也可能在编写程序的过程中进行优化。
软件开发人员应该认识到,程序中相对说比较小的部分(典型地,10%~20%),通常占用全部处理时间的大部分(50%~80%)。
对时间起决定性作用的软件进行优化:
■在不考虑时间因素的前提下开发并精化软件结构;
■在详细设计阶段选出最耗费时间的那些模块,仔细地设计它们的处理过程,以求提高效率;
■使用高级程序设计语言编写程序;
■在软件中孤立出那些大量占用处理机资源的模块;
■必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。

