软件工程第七章面向数据流的设计方法.docx

上传人:b****5 文档编号:3622805 上传时间:2022-11-24 格式:DOCX 页数:18 大小:328.56KB
下载 相关 举报
软件工程第七章面向数据流的设计方法.docx_第1页
第1页 / 共18页
软件工程第七章面向数据流的设计方法.docx_第2页
第2页 / 共18页
软件工程第七章面向数据流的设计方法.docx_第3页
第3页 / 共18页
软件工程第七章面向数据流的设计方法.docx_第4页
第4页 / 共18页
软件工程第七章面向数据流的设计方法.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

软件工程第七章面向数据流的设计方法.docx

《软件工程第七章面向数据流的设计方法.docx》由会员分享,可在线阅读,更多相关《软件工程第七章面向数据流的设计方法.docx(18页珍藏版)》请在冰豆网上搜索。

软件工程第七章面向数据流的设计方法.docx

软件工程第七章面向数据流的设计方法

第七章 面向数据流的设计方法

  面向数据流的设计方法,即通常所说的结构设计法(简称SD方法),是根据需求阶段对数据流的分析(一般用数据流图和数据字典表示)设计软件结构。

数据流图主要描绘信息在系统内部加工和流动的情况,面向数据流的设计方法根据数据流图的特性定义两种“映射”,这两种映射能机械地将数据流图转换为程序结构。

该方法的目标是为软件结构设计提供一个系统化的途径,使设计人员对软件有一个整体的认识。

本章所述技术用于软件的概要设计描述,包括模块、界面和数据结构的定义,这是所有后续开发工作的基础。

每种软件设计方法都有长处和不足,先用哪种方法首先应考虑它适用的范围。

任何软件系统都可以用数据流图表示,理论上,面向数据流的设计方法可用于任一种软件系统的开发。

然而,该方法对那些顺序处理信息且不含层次数据结构的系统最为有效,例如过程控制、复杂的数值分析过程、以及科学与工程方面的应用,等等。

当SD方法用于完全的数据处理时,即使系统中作用层次数据也同样行之有效。

  从系统设计的角度出发,软件设计方法可以分为三大类。

第一类是根据系统的数据流进行设计,称为面向数据流的设计或者过程驱动的设计,以结构化设计方法为代表。

第二类是根据系统的数据结构进行设计,称为面向数据结构的设计或者数据驱动的设计,以LCP(程序逻辑构造)方法、Jackson系统开发方法和数据结构化系统开发(DSSD)方法为代表。

第三类设计方法即面向对象的设计。

第一节 基本概念和设计过程

  面向数据流设计方法是基于模块化、自顶向下细化、结构化程序设计等程序设计技术基础上发展起来的。

该方法实施的要点是:

①建立数据流的类型。

②指明流的边界。

③将数据流图映射到程序结构。

④用“因子化”方法定义控制的层次结构。

⑤用设计测量和一些启发式规则对结构进行细化。

  一、在系统结构图(SC)中的模块

  在系统结构图中不能再分解的底层模块为原子模块。

如果一个软件系统的全部实际加工(数据计算或处理)都由底层的原子模块来完成,而其他所有非原子模块仅仅执行控制或协调功能,这样的系统就是完全因子分解的系统。

如果系统结构图是完全因子分解的,就是最好的系统。

一般地,在系统结构图中有4种类型的模块(如图7-1-1):

图7-1-1 系统结构图的四种模块类型

  ·传入模块:

从下属模块取得数据,经过某些处理,再将其传送给上级模块。

  ·传出模块:

从上级模块获得数据,进行某些处理,再将其传送给下属模块。

  ·变换模块:

即加工模块。

它从上级模块取得数据,进行特定的处理,转换成其他形式,再传送回上级模块。

大多数计算模块(原子模块)属于这一类。

  ·协调模块:

对所有下属模块进行协调和管理的模块。

在系统的输入/输出部分或数据加工部分可以找到这样的模块。

在一个好的系统结构图中,协调模块应在较高层出现。

  在实际系统中,有些模块属于上述某一类型,还有一些模块是上述各种类型的组合。

  二、结构化设计的步骤

  SD方法能方便地将数据流图转换为软件结构,其过程分为五步:

  

(1)确定信息流的类型;

  

(2)划定流界;

  (3)将数据流图映射为程序结构;

  (4)提取层次控制结构;

  (5)通过设计复审和使用启发式策略进一步精化所得到的结构。

  第三步所用映射方法涉及信息流的类型。

信息流分为变换流和事务流两种类型。

  ①变换流。

在基本系统模型(即顶级数据流图)中信息通常以“外部世界”所具有的形式进入系统,经过处理后又以这种形式离开系统,如图7-1-2所示。

输入信息流沿传入路径进入系统,同时由外部形式变换为内部形式,经系统变换中心加工、处理,作为输出信息流又沿传出路径离开系统,并还原为外部形式。

如果数据流图所描述的信息流具有上述特征,则称作变换流。

图7-1-2 信息流

  ②事务流。

由于基本系统模型呈变换流,故任意系统中的信息均可用变换流刻画。

但若数据流具有如图7-1-3所示形状,则称为“事务流”。

此时,单个数据项称为事务(transaction)沿传入路径(也称接受通道)进入系统,由外部形式变换为内部形式后到达事务中心,事务中心根据数据项计值结果从若干动作路径中选定一条继续执行。

图7-1-3 事务流

  值得注意的是在大系统的DFD中,变换流与事务流往往交织在一起。

如,在基于事务流的系统中,当信息沿动作路径流动时可能呈现变换流的特征,因此,下面两节讨论的变换分析法与事物分析法常常需要交叉使用。

  图7-1-4描绘了面向数据流的软件设计过程,当然,任何设计过程都不应该也不可能完全机械化,人的判断力和创造性往往起决定作用。

图7-1-4 面向数据流的设计

第二节 变换分析

  一、变换流与变换型系统结构

  变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。

如图7-2-1所示。

这三步反映了变换型问题数据流的基本思想。

其中,变换数据是数据处理过程的核心工作,而取得数据只不过是为它做准备,给出数据则是对变换后的数据进行后处理工作。

图7-2-1 变换型数据流

  变换型系统结构图如图7-2-2所示,相应于取得数据、变换数据、给出数据,系统的结构图由输入、中心变换和输出等三部分组成。

图7-2-2 变换型的系统结构图

  二、变换映射

  变换映射是体系结构设计的一种策略。

运用变换映射方法建立初始的变换型系统结构图,然后对它做进一步的改进,最后得到系统的最终结构图。

设计的步骤如下。

  步骤1:

复审基本系统模型(0层数据流图和支持信息)。

评估系统规格说明和软件需求规格说明。

  步骤2:

复审和细化软件的数据流图。

重画数据流图时,可以从物理输入到物理输出,或者相反.还可以从顶层加工框开始,逐层向下。

  步骤3:

确定数据流图中含有变换流特征还是含有事务流特征。

通常,系统的信息流总能表示为变换型,但其中也可能遇到明显的事务流特征,这时可采用变换型为主,在局部范围采用事务型的设计方法。

  步骤4:

区分输入流、输出流和中心变换部分,即标明流的边界。

不同的设计人员可能选择不同的流边界,这将导致不同的系统结构图。

  步骤5:

进行一级“因子化”分解,设计顶层和第一层模块。

  首先设计主模块,用程序名字为它命名,将它画在与中心变换相对应的位置上。

做为系统的顶层,它调用下层模块,完成系统所要做的各项工作。

系统结构第一层的设计方针:

为每一个逻辑输入设计一个输入模块,它为主模块提供数据;为每一个逻辑输出设计一个输出模块,它将主模块提供的数据输出;为中心变换设计一个变换模块,它将逻辑输入转换成逻辑输出。

第一层模块与主模块之间传送的数据应与数据流图相对应。

  步骤6:

进行二级“因子化”分解,设计中、下层模块。

这一步工作是自顶向下,逐层细化,为每一个输入模块、输出模块、变换模块设计它们的从属模块。

  输入模块要向调用它的上级模块提供数据,因而它必须有两个下属模块:

一个是接收数据;另一个是把这些数据变换成它的上级模块所需的数据。

输出模块是从调用它的上级模块接收数据,用以输出,因而也应当有两个下属模块:

一个是将上级模块提供的数据变换成输出的形式;另一个是将它们输出。

中心变换模块的下层模块没有通用的设计方法,一般应参照数据流图的中心变换部分和功能分解的原则来考虑如何对中心变换模块进行分解。

  步骤7:

利用一些启发式原则来改进系统的初始结构图,直到得到符合要求的结构图为止。

  三、例

  变换分析由一系列设计步骤组成,经过这些步骤就能把具有变换流特点的数据流图按预先确定的模式映射成软件结构。

下面以“家庭保安系统”的传感器监测子系统为例说明变换分析的各个步骤。

  步骤1:

复审基本系统模型

  基本系统模型指顶级DFD和所有由外部提供的信息。

这一设计步骤是对系统规格说明书和软件需求规格说明书进行评估。

这两个文档描述软件界面上信息的流程和结构。

图7-2-3和7-2-4分别为“家庭保安系统”的顶层和第一层数据流图。

图7-2-3 “家庭保安系统”的顶级数据流图

图7-2-4 “家庭保安系统”的第一级DFD

  步骤2:

复审和精化软件数据流图

  这一步主要是对软件需求规格说明书中的分析模型进行精化,直至获得足够详细的DFD。

例如由“传感器监测子系统”的第一级(图7-2-4的局部)和第二级(图7-2-5)DFD进一步推导出第三级数据流图(图7-2-6),此时,每个变换对应一个独立的功能,可望用一个具有较高内聚度的模块实现,至此已有足够的信息可用于设计“传感器监测子系统”的程序结构,精化过程亦可结束。

图7-2-5 “传感器监测子系统”的第二级DFD

图7-2-6 “传感器监测子系统”的第三级DFD

  步骤3:

确定DFD的特性,判定它为变换流还是事务流。

  一般说来,系统内部的信息流总可以用变换流表示,倘若具有明显的事务特性,还应该采用针对事条流的映射方法。

因此,设计人员首先要判定DFD中占主导地位的信息流,并确定其特性,然后孤立具有变换特性或事务特性的支流,这些支流将用于精化由主导数据流推出的程序结构。

  仍以图7-2-6所示DFD为例,数据沿一个传入路径进来,沿三个传出路径离开,无明显的事务中心,因此,该信息流应属变换流。

  步骤4:

划定输入流和输出流的边界,孤立变换中心

  输入、输出流边界的划分可能因人而异,不同的设计人员可能把边界沿着数据通道向前推进或后退一个处理框,不过这对最后的软件结构影响不大。

“传感器监测子系统”的流界在图7-2-6中用虚线表示。

  步骤5:

执行“一级分解”(firstlevelfactoring)

  一级分解的目标是导出具有三个层次的程序结构,顶层为主控模块;底层模块执行输入、计算和输出功能;中层模块控制、协调底层的工作。

  程序结构可用yourdon结构图表示。

结构图中,方框代表模块,方框内注明模块名称或主要功能。

方框之间的有向边(无二义时也可用无向边)表示模块间的调用关系。

图7-2-7所示的结构图对应于一级分解的上两层模块,即主控模块和下面几个中层控制模块:

  ①输入流控制模块,接收所有输入数据;

  ②变换流控制模块,对内部形式数据进行加工、处理;

  ③输出流控制模块,产生输出数据。

图7-2-7 一级分解

  图7-2-7展示的是一个简单三叉结构,实际处理大型系统的复杂数据流时,可能需要两个甚至多个模块对应上述一个模块的功能。

“一级分解”总的原则是,在完成控制功能并保持低耦合度、高内聚度的前提下尽可能减少模块数。

  “传感器监测子系统”一级分解如图7-2-8所示,其中控制模块的名字概括了所有下属模块的功能。

图7-2-8 传感器监测子系统一纷分解结果

  步骤6:

执行“二级分解”

  二级分解的任务是把数据流图中每个处理框映射成程序结构中一个适当的模块,二级分解过程是从变换中心的边界开始沿输入、输出通道向外移动,把遇到的每个处理框映射为程序结构中的一个模块,其方法如图7-2-9所示。

图7-2-9 二级分解

  虽然图7-2-9中,DFD的处理框与程序结构模块一一对应,但按照软件设计原则进行设计时,可能需要把几个处理框聚合为一个模块,或者把一个处理框裂变为几个模块。

总之,应根据“良好”设计的标准,进行二级分解。

  由图7-2-6输出流部分导出的程序结构如图7-2-10所示。

整个“传感器监测子系统”二级分解的结果见图7-2-11,它仅仅是程序结构的“雏形”(first-cut),后续的复审和精化会反复修改。

程序结构的模块名已隐含了模块功能,但仍有必要为每个模块写一个简要的处理说明,应包括:

  ①进出模块的信息(接口描述);

  ②模块的局部信息;

  ③处理过程陈述,包括主要的判断点和任务;

  ④对有关限制和一些专门特性的简要说明(例如,文件I/O,独立于硬件的特性,特殊的实时要求,等等)。

  这些描述构成第一版设计规格说明书。

  步骤7:

采用启发式设计策略,精化所得程序结构雏形,改良软件质量。

  对于程序结构的雏形,以“模块独立”为指导思想,对模块或合或拆,旨在追求高内聚、低耦合,易实现、易测试、易维护的软件结构。

  例如,“传感器监测子系统”的程序结构雏形可修改如下:

  

(1)只因存在唯一一条传入路径,故输入控制模块可删除;

  

(2)由变换中心产生的整个子结构可归并为“建立警报条件”一个模块(选择电话电码的功能纳入其中),变换控制模块不再需要;

图7-2-10 传感器监测子系统输出流部分导出和程序结构

图7-2-11 传感器监测子系统的程序结构”雏形”

  (3)“格式化显示”和“生成显示”两个模块归并为“产生显示”一个模块。

  “传感器监测子系统”精化后的程序结构如图7-2-12所示。

图7-2-12 传感器监测子系统精化后的程序结构

  上述七个设计步骤的目标是给出软件的一个整体描述。

一旦有了这样一个描述,设计人员即可从整体角度评价和精化软件的总体结构,此时修改所需耗费不多,却能大大提高软件质量。

比较上述设计过程与一般直接编码过程可知,如果源代码是软件唯一的表现形式,设计人员很难从整体的观点评价和精化软件。

第三节 事条分析

  一、事务流与事务型系统结构图

  事务型数据处理问题的工作机理是接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。

我们把完成选择分派任务的部分叫做事务处理中心。

或分派部件。

这种事务型数据处理问题的数据流图如图7-3-1所示。

其中,输入数据流在事务中心T处做出选择,激活某一种事务处理加工。

D1~D4是并列的供选择的事务处理加工。

图7-3-1 事务型数据处理问题

  事务型数据流图所对应的系统结构图就是事务型系统结构图。

如图7-3-2所示。

图7-3-2 事务型系统结构图

  在事务型系统结构图中,事务中心模块按所接受的事务的类型,选择某一个事务处理模块执行。

各个事务处理模块是并列的,依赖于一定的选择条件,分别完成不同的事务处理工作。

每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。

不同的事务处理模块可以共享一些操作模块。

同样,不同的操作模块又可以共享一些细节模块。

  事务型系统结构图在数据处理中经常遇到,但是更多的是变换型与事务型系统结构图的结合。

例如,变换型系统结构中的某个变换模块本身又具有事务型的特点。

  二、事务映射

  在很多应用中,存在某种作业数据流,它可以引发一个或多个处理。

这种数据流就叫做事务。

与变换映射类似,事务映射也是从分析数据流图开始,自顶向下,逐步分解,建立系统结构图。

所不同的是由数据流图映射成的系统结构图不同。

  步骤1:

复审基本系统模型。

  步骤2:

复审和细化软件的数据流图。

  步骤3:

确定数据流图中含有变换流特征还是含有事务流特征。

以上三步与变换映射中的相应工作相同。

  步骤4:

识别事务中心和每一条操作路径上的流特征。

事务中心通常位于几条操作路径的起始点上,可以从数据流图上直接找出来。

输入路径必须与其他所有操作路径区分开来。

  步骤5:

将数据流图映射到事务型系统结构图上。

事务流应映射到包含一个输入分支和一个分类事务处理分支的程序结构上。

输入分支结构的开发与变换流的方法类似。

分类事务处理分支结构包含一个调度模块,它调度和控制下属的操作模块。

  步骤6:

“因子化”分解和细化该事务结构和每一条操作路径的结构。

每一条操作路径的数据流图由它自己的信息流特征,可以是变换流也可以是事务流。

与每一条操作路径相关的子结构可以依照前面介绍的设计步骤进行开发。

  步骤7:

利用一些启发式原则来改进系统的初始结构图。

  三、例

  当数据流具有明显的事务特征时,即能找到一个事务(亦称触发数据项)和一个事条中心,采用事务分析法更为适宜。

图7-3-3 用户交互子系统的二级数据流图

  下面以“家庭保安系统”中“用户交互子系统”为例,说明事务分析法。

  该子系统的第一级数据流图如图7-2-4所示,精化后得到如图7-3-3所示第二级数据流图。

图中“用户命令数据”流入系统后,沿三条动作路径之一离开系统,若将数据项“命令类型”看作事务,该子系统的信息流具有明显的事务特征。

  事务分析法的步聚与变换分析方法基本类似,主要差别在于从数据流图到程序结构的映射。

事务分析法可概括为七个步骤:

  步骤1:

复审基本系统模型;

  步骤2:

复审并精化软件数据流图;

  步骤3:

确定数据流图的特性;

  显然,前三步与变换分析法相同。

  步骤4:

指出事务中心,确定由事务中心发出的每一动作路径的数据流特性。

数条动作路径的公共源头即为事务中心,如图7-3-3所示,事物中心定位为“启动命令处理”框。

事务中心一经确定,即可划定接受路径与所有动作路径的界限(图7-3-4),随后判定每一动作路径上数据流的特征。

例如,图7-3-3“口令处理”路径具有明显变换特征,可立即划定输入、变换和输出的边界(图7-3-4),当进行自顶向下设计时再具体实施映射。

图7-3-4 确定流界

  步骤5:

把数据流图映射为事务处理型的程序结构。

事务处理型的程序结构由“输入”和“散转”两部分组成,输入部分的构成方法如变换分析法,即从事务处理中心开始,沿输入通路向外推进,每个处理框映射为一个模块。

“散转”部分顶层为一“散转”模块,它总控所有对应于每一动作路径的控制模块,每条动作路径都根据它的信息流特征映射为一个程序子结构。

整个过程可用图7-3-5说明。

图7-3-5 事务流映射

  “用户交互子系统”一级分解的结果如图7-3-6所示。

图7-3-6 用户交互子系统的一级分解

  步骤6:

分解并精化事务结构以及每条动作路径所对应的结构。

这些子结构是根据流经每一动作路径的数据流特征,采用本节或上节所述设计步骤一一导出的。

图7-3-7给出了各条动作路径映射后的程序结构。

图7-3-7 用户交互子系统的程序结构雏形

  步骤7:

使用启发式设计策略,精化所得程序结构雏形,改良软件质量,这一步骤与变换分析法相同。

第四节 启发式设计策略

  变换分析与事务分析的最后一步骤都是运用启发式策略对程序结构,这些启发式策略大致有:

  ①模块功能的完善化。

一个完整的功能模块,不仅应能完成指定的功能,而且还应当能够告诉使用者完成任务的状态,以及不能完成的原因。

  ②消除重复功能,改善软件结构。

在系统的初始结构图得出之后,应当审查分析这个结构图。

如果发现几个模块的功能有相似之处,可以加以改进。

  ③模块的作用范围应在控制范围之内。

模块的控制范围包括它本身及其所有的从属模块。

模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。

如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。

  ④尽可能减少高扇出结构,经验证明,一个设计得很好的软件模块结构,通常上层扇出比较高,中层扇出较少,底层扇入到有高扇入的公用模块中。

  ⑤避免或减少使用病态联接。

应限制使用如下三种病态联接:

直接病态联接(内容耦合)、公共数据域病态联接(公共耦合)和通过通信模块联接。

  ⑥模块的大小要适中。

限制模块的大小是减少复杂性的手段之一,因而要求把模块的大小限制在一定的范围之内。

通常规定其语句行数在50~100左右,最多不超过500行。

  ⑦设计功能可预测的模块,但要避免过分受限制的模块。

  一个功能可预测的模块不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。

但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。

对于这种模块,如果调用者不小心使用,其结果将不可预测。

调用者无法控制这个模块的执行,或者不能预知将会引起什么后果,最终会造成混乱。

  为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,调用者可以通过模块接口上的参数表或一些预定义外部参数来规定或改变局部数据结构的大小。

另外,控制流的选择对于调用者来说,应当是可预测的。

而与外界的接口应当是灵活的,也可以用改变某些参数的值来调整接口的信息,以适应未来的变更。

  ⑧软件包应满足设计约束和可移植性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1