正文
4. 描绘软件结构的图形工具
4.1. 层次图和HIPO图
层次图(H图)
层次图用来描绘软件的层次结构。很适于在自顶向下设计软件的过程中使用。
层次图和层次方框图的区别:
层次图 |
层次方框图 | |
作用 | 描绘软件结构 | 描绘数据结构 |
矩形框 | 模块 | 数据元素 |
连线 | 调用关系 | 组成关系 |
例如下面是一个"正文加工系统的层次图"
HIPO图
HIPO图是美国IBM公司发明的“层次图+输入/处理/输出图”的英文缩写。为了能使HIPO图具有可追踪性,在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。
例如下面是一个"正文加工系统的HIPO图"
和H图中每个方框相对应,应该有一张IPO图描绘这个方框代表的模块的处理过程。模块在H图中的编号便于追踪了解这个模块在软件结构中的位置。
4.2. 结构图
Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具。
基本符号:
- 方框代表一个模块;
- 方框之间的直线表示模块的调用关系;
- 尾部是空心圆箭头表示传递的是数据;
- 尾部实心圆箭头表示传递的是控制信息。
附加符号:
- 选择调用:判定为真时调用A,为假时调用B;
- 循环调用:模块M循环调用模块A、B、C。
层次图和结构图并不严格表示模块的调用次序,多数人习惯按调用次序从左到右画模块;也不指明何时调用下层模块,只表明一个模块调用那些模块,没有表示模块内还有没有其他成分;通常用层次图作为描绘软件结构的文档;由层次图导出结构图的过程,可以作为检查设计正确性和评价模块独立性的好方法。
5. 面向数据流的设计方法
5.1. 概述
面向数据流的设计方法定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构。
因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法),也就是基于数据流的设计方法。
信息流有两种类型:
变换流
信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。
事务流
数据沿输入通路到达一个处理T,T根据输入数据的类型在若干个动作序列中选出一个来执行。处理T TT称为事务中心,它可以完成这些任务:(1)接收输入数据;(2)分析每个事务以确定它的类型;(3)根据事务类型选取一条活动通路。
5.2. 变换分析
变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。
变换分析步骤如下:
复查基本系统模型
确保系统的输入数据和输出数据符合实际。
复查并精化数据流图
对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。
不仅要确保数据流图给出了目标系统的正确的逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。
确定数据流图具有变换特性还是事务特性
一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。确定数据流的全局特性和局部特性。
确定输入流和输出流的边界,从而孤立出变换中心
输入流和输出流的边界和对它们的解释有关,不同设计人员可能会在流内选取稍微不同的点作为边界的位置。
完成“第一级分解”
位于软件结构最顶层的控制模块C m 协调下述从属的控制功能:(1)输入信息处理控制模块C a,协调对所有输入数据的接收;(2)变换中心控制模块C t,管理对内部形式的数据的所有操作;(3)输出信息处理控制模块C e ,协调输出信息的产生过程。
完成“第二级分解”
处理映射成软件结构中一个适当的模块。完成第二级分解的方法是:(1)从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中C a控制下的一个低层模块;(2)然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块C e 控制的一个低层模块;(3)最后把变换中心内的每个处理映射成受C t 控制的一个模块。
- 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化
为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,为了得到一个易于实现、易于测试和易于维护的软件结构,应该对初步分割得到的模块进行再分解或合并。
5.3. 事务分析
虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的事务中心时,还是以采用事务分析方法为宜。
事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同:
由事务流映射成的软件结构包括一个接收分支和一个发送分支;
映射出接收分支结构的方法和变换分析映射出输入结构的方法很相像,即从事务中心的边界开始,把沿着接收流通路的处理映射成模块;
发送分支的结构包含一个调度模块,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。
举个例子,设计一个产品,它将一个文件名作为输入,并返回文件中的字数。
数据流图:
软件结构:
一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。
机械地遵循变换分析或事务分析的映射规则,可能会得到一些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。
如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。
5.4. 设计优化
设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单的数据结构。
软件开发人员应该认识到,程序中相对说比较小的核心部分(10%~20%),通常占用全部处理时间的大部分(50%~80%)。
对于时间是决定性因素的应用场合,可能有必要在详细设计阶段,也可能在编写程序的过程中进行优化。
对时间起决定性作用的软件进行优化应该遵循如下规则:
在不考虑时间因素的前提下开发并精化软件结构;
在详细设计阶段选出最耗费时间的那些模块,仔细地设计它们的处理过程,以求提高效率;
使用高级程序设计语言编写程序;
在软件中孤立出那些大量占用处理机资源的模块;
必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。