《系统设计-模块设计原则.ppt》由会员分享,可在线阅读,更多相关《系统设计-模块设计原则.ppt(72页珍藏版)》请在三一办公上搜索。
1、第五章 系统分析(2),-模块设计的原则,模块,为降低系统开发的难度或复杂性,常常将系统进行模块化。所谓模块化,就是将系统划分为子系统,子系统划分为若干模块,大模块划分为小模块的过程。模块划分的目的主要是降低系统的开发难度,增加系统的可维护性等。,模块,模块是可以组合、分解和更换的单元,是组成系统、易于处理的基本单元。系统中的任何一个处理功能都可以看成一个模块,也可以理解为用一个名字就可以调用的一段程序语句。a.模块应具备以下四个要素:输入和输出:模块的输入来源和输出去向都是同一个调用者,一个模块从调用者取得输入,加工后再把输出返回调用者。功能:模块把输入转换成输出所做的工作。内部数据:仅供该
2、模块本身引用的数据;程序代码:用来实现模块功能的程序。,模块,其中,输入/输出和功能是模块的外部特性,反映模块的外貌;内部数据和程序代码是模块的内部特性。在结构化设计中,首先关心外部特性,其内部特性只做必要了解。因此,可以认为,模块就是指具有输入/输出、逻辑功能、运行程序和内部数据4种属性的一组程序。,模块调用,模块调用的类型如图所示。,模块调用,调用:在模块结构图中,用连接两个模块的箭头表示调用,箭头总是由调用模块指向被调用模块,但是应该理解为被调用模块执行后又返回到调用模块。判断调用:一个模块是否调用一个从属模块,取决于调用模块内部的判断条件,则该调用称为模块间的判断调用,采用菱形符号表示
3、。循环调用:如果一个模块通过其内部的循环功能循环调用一个或多个从属模块,则该调用称为循环调用,用弧形箭头表示。,int max(int x,int y)int z;z=xy?x:y;return(z);Main():max(3,4):,Main(),Max(x,y)求最大值,Z,x,y,模块调用实例,模块划分的目的,主要是降低系统的开发难度,增加系统的可维护性等。,可维护性,局部修改,模块间的联系尽可能的少(低耦合)而模块内的联系尽可能多(高聚合),模块独立性的度量之一:耦合度,耦合度是模块间的联结关系,衡量不同模块间的相互依赖的紧密密程度。耦合度越高,模块独立性越弱,无耦合没有依赖关系,松散
4、耦合有少量依赖关系,紧密耦合有很多依赖关系,模块耦合度,耦合度强弱的因素:,一模块对另一模块的引用一模块向另一模块传递的数据量一模块施加到另一模块的控制的数量模块间接口的复杂程度,耦合有6种不同的类型(即模块间的联结方式),由好到差依次为:非直接耦合、数据耦合、标记(特征)耦合、控制耦合、公共耦合、内容耦合。,模块间耦合的类型:,模块独立性,弱,强,公共耦合,内容耦合,高,低,非直接耦合数据耦合标记耦合控制耦合,(1)非直接耦合,两个模块没有直接关系(模块1和模块2),模块之间的联系是通过主模块的控制和调用实现的,模块独立性最强。,模块1,模块2,模块3,模块4,(2)数据耦合,一模块调用另一
5、模块时,被调用模块的输入、输出都是简单的数据,属松散耦合。数据耦合是模块间必要的数据通信,是不可避免的。数据耦合是模块设计的目标。,数据耦合举例,开发票,计算水费,单价数量,金额,数据耦合举例,计算水电费,计算水费,计算电费,用水量,用电量,水费,电费,(3)标记耦合(特征耦合),如两个模块通过传递数据结构(不是简单数据,而是记录、数组等)加以联系,而被调用模块只需要部分数据项,则称这两个模块之间存在标记耦合或特征耦合。特征耦合传递的是数组之类的数据结构,使互不相关的模块建立了依赖关系,往往会造成侦错上的困难。,标记耦合举例,计算水电费,计算水费,计算电费,住户情况,水费,电费,住户情况,“住
6、户情况”包含水费和电费、煤气费、电话费等。“住户情况”是一个数据结构,图中模块都与此数据结构有关.“计算水费”和“计算电费”本无关,由于引用了此数据结构产生依赖关系,它们之间也是标记偶合.,将标记耦合修改为数据耦合举例,计算水电费,计算水费,计算电费,本月用水量,本月用电量,水费,电费,(4)控制耦合,控制耦合是指一个模块将控制信息传递给另一个模块,以控制该模块的内部处理逻辑。从分解的角度看,导致控制耦合的主要原因是分解不彻底,被调用模块不是执行单一的功能。,控制耦合举例,A,计算平均分或最高分,B,平均/最高,成绩,控制耦合举例,读入分数,输出结果,计算平均分,计算最高分,平均/最高?,调用
7、逻辑性模块 B时,须先传递控制信号(平均分/最高分),以选择所需的操作。控制模块必须知道被控模块的内部逻辑,增强了相互依赖.,B,控制耦合增加了模块之间的复杂性,调用模块必须知道被调模块的内部逻辑,增加了相互依赖。去除模块间控制耦合的方法:(1)将被调用模块内的判定上移到调用模块中进行(2)被调用模块分解成若干单一功能模块,改进的方法:,改控制耦合为数据耦合举例,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,控制耦合举例,A,发奖牌,名次(开关量),奖牌,控制耦合,被调用模块内处理逻辑模式,功能A,功能B,判别,改控制耦合为数据耦合举例,A,发金牌,发银牌,发铜牌,金牌,银牌,铜
8、牌,A,取口令并核对,B,用户名、口令,对/不对,控制耦合举例,A,取口令,B,用户名,口令,将B中核对口令功能划分到 A,(5)公共耦合(公共数据区耦合),如果多个模块访问同一公共数据区(global data area),则称之为公共耦合。可以理解为:公共耦合就是多个模块访问同一个全局变量,或者多个模块访问同一全局性的数据结构。公共数据区指:全局数据结构 共享通讯区 内存公共覆盖区等,公共耦合举例,公共数据区,松散的公共耦合,公共数据区,紧密的公共耦合,公共耦合举例,公共数据区,C,B,模块A、B、C间存在错综复杂的联系,公共耦合举例,所有的公共 耦合关系,A,E,B,C,D,6个模块共享
9、一个公共数据区,F,(1)系统可理解性降低(模块间存在错综复杂的连系)(2)系统可维护性差(修改变量名或属性困难)(3)系统可靠性差(公共数据区及全程变量无保护措施)慎用公共数据区和全程变量!,公共耦合存在的问题:,(6)内容耦合,如果两个模块之一和另一个模块的内部属性有关(一个模块直接调用另一个模块的内容),则称这两个模块为内容耦合,也称之为病态耦合(pathological coupling),这是一种最高程度的耦合,应避免使用。最不好内容耦合形式!,发生内容耦合的情形:,(1)一模块直接访问另一模块的内部数据(2)一模块不通过正常入口转到另一模块内(3)两模块有一部分代码重叠(4)一模块
10、有多个入口,模块化设计对耦合度的要求:,耦合是影响系统复杂程度和设计质量的重要因素目标:建立模块间耦合度尽可能松散的系统,如何降低模块间耦合度:,(1)如模块必须存在耦合,选择适当的耦合类型原则:尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合(2)降低模块间接口的复杂性,接口复杂性与耦合类型的关系:,4.模块独立性的度量之二:聚合度,衡量一个模块内部各成分之间彼此结合的紧密程度设计目标:高聚合(一模块的所有成分都直接参与并且对于完成同一功能来说都是最基本的),模块的聚合性类型:,低 偶然聚合 内 逻辑聚合 聚 时间聚合 性 过程聚合 通信聚合 顺序聚合 高 功能聚合,模块独
11、立性,弱(功能分散),强(功能单一),(1)功能聚合,一个模块内的所有成分的处理动作全部为完成某个功能,且只执行一个功能,缺一不可,称为功能聚合。聚合性最强。如:计算实发工资,打印发票等,(2)顺序聚合,一个模块能完成多个操作,前一个操作处理的输出数据是下一个操作处理的输入数据,模块中各成份的工作是有次序的,各成份的关系也较紧密,则称为顺序聚合。,顺序聚合模块例,模块1,模块2,(3)通信聚合,模块内各部分使用相同的输入数据,或产生相同的输出结果,称为通信聚合,通信聚合模块例,产生工资报表,计算平均工资,职工工资记录,职工工资报表,平均工资,产生职工工资报表并计算平均工资模块,通信聚合模块例,
12、(4)过程聚合,一个模块内各处理成分的动作各不相同,彼此也没什么关系,但它们都受一个控制流的支配,且决定了它们的执行次序。,过程聚合模块,建立方程组系数矩阵,全部任务纳入一个模块,得到一过程性模块,高斯消去法,回 代,高斯消去法解题流程,(5)时间聚合,模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。例如:初始化系统模块、系统结束模块、紧急故障处理模块等均是时间性聚合模块.,(6)逻辑聚合,把几种相关功能(逻辑上相似的功能)组合在一模块内,每次调用由传给模块的参数确定执行哪种功能。,逻辑聚合模块例,A1,B1,C1,EFG模块内部逻辑,E、F、G逻辑功能相似,组成新模块EF
13、G,缺点:增强了耦合程度(控制耦合)不易修改,效率低,公用代码段,公用代码段,课程设计中的问题,逻辑聚合缺点:,不易修改 增强了耦合程度(控制耦合)效率低,(7)偶然聚合,模块内各部分间无联系,模块M中的三个语句没有任何联系缺点:可理解性差,可修改性差,例:,模块聚合性的判断,5.耦合、聚合与模块独立性关系,耦合与聚合都是模块独立性的定性标准,都反映模块独立性的良好程度。但耦合是直接的主导因素,聚合则辅助耦合共同对模块独立性进行衡量。,控制耦合举例,A,计算平均分或最高分,B,平均/最高,成绩,逻辑聚合,改控制耦合为数据耦合举例,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,功能
14、聚合,A,取口令并核对,B,用户名、口令,对/不对,控制耦合举例,顺序聚合,A,取口令,B,用户名,口令,将B中核对口令功能划分到 A,功能聚合,聚合与耦合密切相关,同其它模块强耦合的模块意味着弱聚合,强聚合模块意味着与其它模块间松散耦合.设计目标:力争强聚合、弱耦合,5.耦合、聚合与模块独立性关系(续),五 设计优化,将初始sc(系统结构图)根据模块独立性原则进行精化,对模块进行合并、分解修改、调整,得到高内聚、低耦合模块,得到易于实现、易于测试和易于维护的软件结构,产生设计文档的最终SC。,改进结构设计的指导原则,(1)程序结构尽可能与问题结构相对应(2)模块功能的完整(3)消除重复功能(
15、4)作用范围应在控制范围内(5)减少高扇出争取高扇入(6)模块大小适中(7)降低模块接口的复杂性(8)模块功能可预测,(1)消除重复的功能 同一功能的程序多次出现会浪费编码时间,并不易调试和维护,应予以合并。,正确的合并,错误的合并,(2)减少高扇出,争取高扇入,模块调用的直接下层模块的个数,称为扇出(Fan out)模块被其他各模块调用的个数,称为扇入(Fan in)原则:扇出不宜过大,7,因为属自然分类情况,易理解,扇入表明有多少个上级模块直接调用该模块,扇入越大,则共享该模块的上级模块数目越多,这是有好处的。扇出是指某模块直接控制或调用的模块数目,扇出过大意味着模块过分复杂,需要控制和协
16、调过多的下级模块,这时应适当增加中间层次的控制模块。扇出太小时应把下级模块进一步分解成若干个子功能模块或合并到上级模块。,如果一个规模很小的底层模块的扇入数为1,则可把它合并到它的上层模块中,但扇入数较大时则不能向上合并(否则将导致对该模块做多次编码和排错)。如果一个模块具有多种功能(扇出数较大),应当考虑做进一步分解,使模块的扇出数控制在7以内。设计的较好的系统结构通常是顶层扇出较高,中层扇出较小,底层扇入较大。,清真寺型,不够好,底层模块复用度低,金字塔型,相关技巧:良好的结构图往往呈“清真状”,即“顶为尖下层逐渐加宽底层收窄”结构图的形态应该均衡,即从顶到底层的路径长短不该过于悬殊,(3
17、)模块大小适中,模块过大:可理解程度下降 考虑对该模块分解模块过小:开销大于有效操作,系统接口复杂 考虑是否同它的调用模块合并,几种情况下的小模块不合并:模块具有独立的功能模块功能可能会发生变化模块的复用性好,或者其调用模块很复杂,(4)降低模块接口的复杂性,接口传递信息应简单且和模块功能一致。,例:求一元二次方程的根设求根模块调用形式为:(1)QUADROOT(TBL,X)TBL传递系数的数组 X存放根的数组(2)QUADROOT(A,B,C,ROOT1,ROOT2)A,B,C为方程系数 ROOT1,ROOT2是两个根,(5)模块功能可预测,可将模块看成黑盒子,相同输入可产生相同输出,称其功能为可预测的。模块带有内部状态,其功能可能是不可预测的。这样的模块难理解、难测试、难维护。,