图 4-14程序结构的有关术语
( 3)扇出是一个模块直接调用的模块数目,扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过小也不好。经验表明,一个设计得好的典型系统的平均扇出通常是3或4。
( 4)扇出太大一般是因为缺乏中间层次,应该适当增加中间层次的控制模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。当然分解模块或合并模块必须符合问题结构,不能违背模块独立原理。
( 5)一个模块的扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多,这是有好处的,但是,不能违背模块独立单纯追求高扇入。
( 6)观察大量软件系统后发现,设计得优秀的软件结构通常顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去。 ? 模块的作用域应该在其控制域之内
16
图4-15 模块的作用域和控制域
模块的作用域定义为受该模块判定影响的所有模块的集合。模块的控制城是这个模块本身以及所有直接或间接从属于它的模块的集合。例如,在图 4-15中模块A的控制域是A、B、C、D、E、F等模块的集合。
在一个设计得很好的软件系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块。例如,如果图 4-15中模块A做出的判定只影响模块B,那么是符合这条规则的。但是,如果模块A做出的判定同时还 影响模块 G中的处理过程,这样的结构使得软件难于理解。其次,为了使得A中的判定能影响G中的处理过程,通常需要在A中给一个标记设置状态以指示判定的结果,并且应该把这个标记传递给A和G的公共上级模块M,再由M把它传给G。这个标记是控制信息而不是数据,因此将使模块间出现控制耦合。
可以通过修改软件结构能使作用域是控制域的子集,一个方法是把做判定的点往上移,例如,把判定从模块 A中移到模块M中、另一个方法是把那些在作用域内但不在控制域内的模块移到控制域内,例如,把模块G移到模块A的下面,成为它的直属下级模块。 5.模块接口的低复杂度
模块接口复杂是软件发生错误的主要原因之一。应该设计模块接口使得信息传递简单并且和模块的功能一致。
例如,一元二次方程的根的模块QUAD-ROOT(TBL,X),其中用数组TBI。传送方程的系数,用数组X回送求得的根。这种传递信息的方法不利于对这个模块的理解,不仅在维护期间容易引起混淆,在开发期间也可能发生错误。下面这种接口可能是比较简单的。
QUAD_ROOT(A,B,C,ROOTI,ROOT2)其中A、B、C是方程的系数,ROOTI和 ROOTZ是算出的两个根。
接口复杂或者不一致是紧耦合或低内聚的原因所致,应该重新分析这个模块的独立性,力争降低模块接口的复杂程度。 6.单入口单出口的模块
这条启发式规则表明不要使模块间出现内容耦合。在结构上模块顶部有单入口,模块底部单出口,这样的结构比较容易理解、比较容易维护。
17
7.模块功能应可预测
模块的功能应能预测,如果一个模块可以当做一个黑盒子,只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。带有内部存储器的模块的功能可能是不可预测的,因为它的输出可能取决于内部存储器(例如某个标记)的状态。由于内部存储器对于上级模块而言是不可见的,所以这样的模块不易理解、难于测试和维护。
如果一个模块只完成一个单独的子功能,则表现高内聚;但是,如果一个模块任意限制局部数据结构的大小,过分限制在控制流中可以做出的选择或者外部接口的模式,那么这种模块的功能就过分局限,使用范围也就过于狭窄。在使用过程中将不可避免地需要修改功能过分局限的模块,以提高模块的灵活性,扩大它的使用范围;但是,在使用现场修改软件的代价是很高的。 4.3 面向数据流的设计方法
在这一节,将介绍一种应用最广、技术上也较完善的系统设计方法,面向数据流的设计方法。面向数据流的设计方法的目标是给出设计软件结构的一个系统化途径。
结构化设计方法属于面向数据流的设计方法。在需求分析阶段,首先要考虑的一个关键问题就是信息流。信息流是软件开发人员考虑问题的出发点和基础。信息流从系统的输入端向输出端流动,要经历一系列的变换或处理。用来表现这个过程的数据流图( DFD)就是软件系统的逻辑模型。面向数据流的设计要解决的任务,就是在上述需求分析的基础上,将DFD图映射为软件系统的结构。换句话说,这类设计方法允许把用DFD图表示的系统逻辑模型方便地转换成对于软件结构的初始设计描述。在结构化设计方法中,软件的结构将用系统结构图来描述。
为了有效地实现从 DFD图到系统结构图的映射,结构化设计(SD)方法的步骤如下:
S1:复审DFD图,必要时可再次进行修改或细化;
S2:鉴别DFD图所表示的软件系统的结构特征,确定它所代表的软件结构是属于变换型还是事务型;
S3:按照SD方法规定的一组规则,把DFD图映射为初始的系统结构图; S4:按照设计改进原则细化和改进初始的系统结构图,获得最终系统结构图。 4.3.1 基本概念
以面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法,信息流有下述两种类型。 (1)变换流
18
根据基本系统模型,信息通常以外部世界的形式进入软件系统,经过处理以后再以外部世界的形式离开系统。
如图4-16所示,信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当信息流具有这些特征时,称为变换流。
图4-16 变换流
(2)事务流
原则上所有信息流都可以归结为变换流类。但是,当信息流具有和图 4-17类似的形状时,称信息流是以事务为中心,也就是说,数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类系统的特征能具有在多种事务中选择执行某类事务的能力。事务型结构至少有一条接受路径,一个事务中心,与若干条动作路径组成。这类信息流应该划为一类特殊的信息流,称为事务流。图4-17 中的处理T称为事务中心,它完成下述任务:
1)接收输入事务(事务又称为输入数据); 2)分析每个事务以确定它的类型; 3)根据事务类型选取一条活动通路。
图4-17 事务流
19
基于面向数据流方法的设计过程如图4-18所示。
图4-18 面向数据流方法设计过程
4.3.2 系统结构图的组成
系统结构图是SD方法在总体设计中使用的主要表达工具,用来显示软件的组成模块及其调用关系。SD方法约定,用矩形框来表示模块,用带箭头的连线表示模块间的调用关系。在调用线的两旁,应标出传入和传出模块的数据流。 (l)系统结构模块的表示符号
图4-19 系统结构图的六种模块
20
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库软件工程第四讲教案(4)在线全文阅读。
相关推荐: