图 4-7偶然内聚
2.内聚
内聚表示一个模块内各个元素间结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。简单地说,理想内聚的模块只做完成一个子功能。 设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多;但是,低内聚不要使用。
内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。 (1)偶然内聚
如果一个模块完成一组任务,这些任务间的关系很松散,这就称为偶然内聚,参阅图 4-7。例如在写完某一个程序之后,发现一些语句在两处或多处出现,于是把这些语句作为一个模块,这样模块为偶然内聚的模块。 ( 2)逻辑内聚
如果一个模块完成的功能在逻辑上属于相同或相似的一类,则称为逻辑内聚。例如,一个模块的功能是产生各种类型的全部输出,参阅图 4-8。
11
图 4-8逻辑内聚
图 4-9通信内聚模块
( 3)时间内聚
如果一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。例如,模块完成各种初始化工作。
在偶然内聚的模块中.各种元素之间没有实质性联系,很可能在一种应用场合需要修改这个模块,在另一种应用场合又不允许这种修改,从而陷入困境。事实上,偶然内聚的模块出现修改错误的概率比其他类型的模块高得多。
12
在逻辑内聚的模块中,不同功能混在一起,合用部分程序代码,即使局部功能的修改有时也会影响全局。因此,这类模块的修改也比较困难。 时间关系在一定程度上反映了程序的某些实质,所以时间内聚比逻辑内聚好一些。
( 4)过程内聚
如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。使用程序流程图作为工具设计软件时,常常通过研究流程图确定模块的划分,这样得到的往往是过程内聚的模块。 ( 5)通信内聚
如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。图 4-9所示的是通信内聚模块的示意图。 ( 6)信息内聚
信息内聚模块能完成多种功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点,例如图 4-10所示的模块有4个功能,即这个模块将根据要求,确定该执行哪一个功能。但这个模块都基于同一数据结构,即符号表。
图 4-10信息内聚
图 4-11内聚的七种类型
( 7)功能内聚
13
如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。 内聚的七种类型的级别比较如图 4-11所示。
重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,通过修改设计提高模块的内聚程度,并降低模块间的耦合程度,从而获得较高的模块独立性。
4.2.5 结构设计原则
软件总体设计包括模块构成的程序结构和输入输出数据结构。其目标是产生一个模块化的程序结构,并明确模块间的控制关系,以及定义界面、说明程序的数据,进一步调整程序结构和数据结构。软件设计从需求分析开始,逐步分层的导出程序结构和数据结构,如图4-12所示。
图 4-12结构变化
14
图 4-13对同一问题的多种软件结构
同一问题可有多个解,如图 4-13所示。提高模块的内聚程度降低模块间的耦合程度是一个评价的标准。
改进软件设计、提高软件质量的原则如下。 1.模块高独立性
设计出软件的初步结构以后,应该进一步分解或合并模块,力求降低耦合提高内聚。例如,多个模块公有的一个子功能可以独立定义一个模块,由这些模块调用;有时可以通过分解或合并模块以减少控制信息的传递及对全程数据的引用,并降低接口的复杂程度。 2.模块规模适中
. 一个模块的规模不应过大,最好能写在一页纸内。从心理学角度研究得知,当一个模块包含的语句数超过30以后,模块的可理解程度迅速下降。 ? 大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,一般说来,分解后不应该降低模块独立性。
? 过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在,特别是只有一个模块调用它时,通常可以把它合并到上级模块中去而不必单独存在。 3.深度、宽度、扇出和扇入适当
( 1)深度表示软件结构中控制的层数,能够粗略地标志一个系统的大小和复杂程度(参阅图4-14)。它和程序长度之间应该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层数过多,则应该考虑是否有许多管理模块过于简单,需要适当合并。
( 2)宽度是软件结构内同一个层次上的模块总数的最大值。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。
15
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库软件工程第四讲教案(3)在线全文阅读。
相关推荐: