摘要:一个合理的模块划分,应该是内部联系强,模块间尽可能独立,接口明确、简单,有适当的共用性,要满足“藕合小,内聚大”的原则。
3.4.3.4模块的藕合与内聚
一个合理的模块划分,应该是内部联系强,模块间尽可能独立,接口明确、简单,有适当的共用性,要满足“藕合小,内聚大”的原则。
在结构化设计当中,采用“自顶向下,逐步细化”的方法将系统分解成为一些相对独立、功能单一的模块。如何度量模块之间的独立性呢?由于模块内的互相联系越多,模块的独立性就越强,因此,这里再引入模块藕合和内聚的概念。
藕合就是表示模块之间联系的程度。紧密藕合表示模块之间联系非常强,松散藕合表示模块之间联系比较弱,非藕合则表示模块之间无任何联系,是完全独立的。
内聚则用来表示模块内部各组成成分之间的联系程度。一般说来,在系统中各模块的内聚越大,则模块间的藕合越小。但这种关系并不是绝对的。藕合小使得模块间尽可能相对独立,从而各模块可以单独开发和维护。内聚大使得模块的可理解性和维护性大大增强。因此,在模块的分解中应尽量减少模块的藕合度,力求增加模块的内聚度。
模块的藕合方式有3种,如图3.22所示。
·数据藕合。如果两个模块之间的通信信息是若干数据项,则这种藕合方式称为数据藕合。例如,为了计算实发工资,“计算工资”模块必须把工资总额和扣款数传输给“计算实发工资”模块,而“计算实发工资”模块在计算出实发工资后又将实发工资送回到“计算工资”模块。
·控制藕合。如果两个模块之间传输的信息是控制信息,
则该藕合称为控制藕合。传送的控制信息可分成两类:一类是判定参数,调用模块通过该判定参数的一个值控制被调用模块的工作方式,若判定参数出错的值不同于前者则导致被调用模块按另一种方式工作;另一种是地址参数,调用模块直接转向被调用模块内部的某一地址,这时若改动一个模块则必将影响另一模块。因为控制祸合方式的藕合程度较高,应尽量避免采用地址参数的方式。
·非法藕合。两个模块之间,不经过调用关系,彼此直接使用或修改对方的数据这是?差的藕合方式,在结构化设计时决不允许出现这种情况。此外,在程序设计中,应做到各模块只使用自身的局部变量,尽量不使用全局变量,模块之间必不可少的数据联系都必须以参数形式正确指定。
模块的内聚方式有如下几种,其性能比较如图3.23所示。
·巧合内聚。巧合内聚或称偶然内聚是指模块内各组成部分之间毫无内在联系,整个模块是一种偶然结合,不易修改或维护。
·逻辑内聚。逻辑内聚是指模块各组成部分的处理动作在逻辑功能上是相似的。例如,把系统中与“输出”有关的操作抽取出来组成一个模块,包括将数据在屏幕上显示、从打印机上打印、拷贝到磁盘上等,则该模块就是逻辑内聚。逻辑内聚的内聚程度稍强于巧合内聚,但仍不利于修改和维护。
·时间内聚。如果一个模块包含的任务必须在同一段时间内执行,就叫做时间内聚。
·过程内聚。过程内聚是指一个模块内各组成部分的处理动作各不相同,彼此也没有什么关系,但他们受同一个控制流支配,决定他们的执行次序。过程内聚是由一段公共的处理过程组合成的模块。例如,把处理过程中的所有循环部分,判定部分和顺序执行部分划分到一个模块,则它们都是过程内聚的,过程
内聚的内部结构一般是由程序流程图直接演变出来的。显然,采用过程内聚时,模块间的藕合度比较高。
·通信内聚。通信内聚是指一个模块内组成部分的处理动作都使用或产生相同的数据,例如报表打印模块,各部分都从若干共同的数据来源接收数据,然后转换、汇总并打印出各种报表。
·顺序内聚。顺序内聚是指一个模块内各组成部分的处理动作有顺序关系,某一成分的输出是另一成分的输入。例如,“录入和汇总”模块、“统计和打印”模块都是顺序内聚模块。
·功能内聚。功能内聚表示一个模块内各组成部分的处理动作都是为完成同一个功能而联系在一起的,即一个模块执行一个功能,且完成该功能所必须的全部成分都包含在模块中。例如,计算工资、打印月报表等。由于这类模块的功能明确、模块间的藕合度小,应力求按功能内聚划分模块,以便于维护。
以上前三种内聚为低内聚,中间两种为中内聚,最后两种为高内聚。
章节目录
返回全书目录系统分析师章节辅导教程
软考备考资料免费领取
去领取