层次图用来描绘软件的层次结构在图中己经非正式地使用了层次图。层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。图4.3是层次图的一个例子,最顶层的方框代表正文加工系统的主控模块,它调用下层模块完成正文加工的全部功能;第二层的每个模块控制完成正文加工的一个主要功能,例如“编辑”模块通过调用它的下属模块可以完成6种编辑功能中的任何一种。
图4.3 正文加工系统的层次图
层次图很适于在自顶向下设计软件的过程中使用。
HIPO图是美国IBM公司发明的“层次图加输入/处理/输出图”的英文缩写。为了能使HIPO图具有可追踪性,在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。编号规则和前面课程中介绍的数据流图的编号规则相同,例如,图4.3加了编号后得到的图4.4。
图4.4 带编号的层次图
和H图中每个方框相对应,应该有一张IPO图描绘这个方框代表的模块的处理过程。但是,有一点应该着重指出,那就是HIPO图中的每张IPO图内都应该明显地标出它所描绘的模块在H图中的编号,以便追踪了解这个模块在软件结构中的位置。
Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头(或直线)表示模块的调用关系。因为按照惯例总是图中位于上方的方框代表的模块调用下方的模块,即使不用箭头也不会产生二义性,为了简单起见,可以只用直线而不用箭头表示模块间的调用关系。
在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。图4.5是结构图的一个例子。
图4.5 结构图的例子——产生最佳解的一般结构
和H图中每个方框相对应,应该有一张IPO图描绘这个方框代表的模块的处理过程。但是,有一点应该着重指出,那就是HIPO图中的每张IPO图内都应该明显地标出它所描绘的模块在H图中的编号,以便追踪了解这个模块在软件结构中的位置。
图4.6 判定为真时调用A,为假时调用B
图4.7 模块M循环调用模块A、B、C
注意,层次图和结构图并不严格表示模块的调用次序。虽然多数人习惯于按调用次序从左到右画模块,但并没有这种规定,出于其他方面的考虑(例如为了减少交叉线),也完全可以不按这种次序画。此外,层次图和结构图并不指明什么时候调用下层模块。通常上层模块中除了调用下层模块的语句之外,究竞是先执行调用下层模块的语句还是先执行其他语句,在图中丝毫没有指明。事实上,层次图和结构图只表明一个模块调用那些模块,至于模块内还有没有其他成分则完全没有表示。
通常用层次图作为描绘软件结构的文档。结构图作为文档并不很合适,因为图上包含的信息太多有时反而降低了清晰程度。但是,利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,却可以作为检查设计正确性和评价模块独立性的好方法。传送的每个数据元素都是完成模块功能所必须的吗?反之,完成模块功能必须的每个数据元素都传送来了吗?所有数据元素都只和单一的功能有关吗?如果发现结构图上模块间的联系不容易解释,则应该考虑是否设计上有问题。