模块独立性

模块独立性


一、模块独立性概念

        模块独立性的概念是模块化、抽象和信息隐蔽的直接结果。

        模块独立性是软件质量的关键,它指软件系统中的每个模块只涉及软件要求的具体子功能,而和系统中其他模块接口是简单的。这样做不仅仅便于软件测试和维护,还使模块化程度较高的软件易于开发,尤其当一组开发人员共同开发一个软件时,模块化能够分割功能,而且接口可以简化。


二、模块独立性标准

        模块的独立性可以用两个定性标准度量:耦合和内聚。

        耦合是模块之间相互连接的紧密程度的度量。模块之间的连接越紧密,联系越多,耦合性就越高,而其模块独立性就越弱。

        内聚是一个模块内部各个元素彼此结合的紧密程度的度量。

        一个模块内部各个元素之间的联系越紧密,内聚性就越高,相对于其他模块之间的耦合性就会降低,而模块独立性就越强。因此,模块独立性较强的模块应该是高内聚低耦合的模块。


三、耦合

        耦合的强弱取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。一般模块之间的连接方式有7 种,构成的耦合也有7 种类型。

1) 非直接耦合

        如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用实现的,这就是非直接耦合。

        这种耦合的模块独立性最强。但是,在一个软件系统中不可能所有的模块之间都无任何连接。

2) 数据耦合

        如果两个模块彼此间通过数据参数(不是控制参数、公共数据结构或外部变量)交换信息,这种耦合称为数据耦合。

        由于限制了只通过参数表传递数据,所以按数据耦合开发的程序界面简单、安全可靠。数据耦合是松散的耦合,模块之间的独立性比较强,在系统中必须有这类耦合。

3) 标记耦合

        如果模块之间通过参数表传递记录信息,就是标记耦合。

由于模块传递的不是简单变量,而是某一数据结构的子结构,所以在设计中应避免这种耦合。

4) 控制耦合

        如果模块传递的信息中有控制信息,就称作控制耦合。

        这种耦合的实质是在单一接口上选择多功能模块中的某项功能。因此,对被控制模块的任何修改,都会影响控制模块。控制耦合属于中等程度的耦合,它增加了系统的复杂程度。

5) 公共耦合

        如果一组模块通过同一个公共数据环境相互作用,则它们之间的耦合称为公共耦合。

        公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等。由于这种耦合的模块都要访问同一个公共数据环境,所以常会引发下列问题。

        A、公共数据环境内某个数据的修改将会影响到所有访问该公共环境的其他模块。

        B、无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性。

        C、公共数据名的使用,降低了程序的可读性。

        另外,公共耦合的模块数越多,公共耦合的复杂程度就越高,因此在程序设计时要少使用公共耦合,只有在模块之间共享的数据很多,而且通过参数表传递不是很方便的情况下才使用公共耦合。

6) 内容耦合

        如果发生下列情形之一,两个模块之间就发生了内容耦合。

        A、一个模块直接访问另一个模块的内部数据。

        B、一个模块不能通过正常入口转到另一模块的内部。

        C、两个模块有一部分程序代码重叠(只可能出现在汇编语言中)。

        D、一个模块有多个入口。

        内容耦合属于最高程度的耦合,应该尽量避免使用。

7) 外部耦合

        如果一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称为外部耦合。

        总之,为了降低软件的复杂程度,程序设计人员应尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。


四、内聚

        内聚是一个模块内部各个元素彼此结合的紧密程度的度量。一个内聚程度高的模块应当完成软件过程中的单一任务。它是信息隐蔽概念的一种自然扩展。

        一般模块的内聚性也有7 种类型。

1) 偶然内聚

        如果一个模块各部分之间没有关系,或者即使有关系,这种关系也是很松散的,则称作偶然内聚。

        它是内聚程度最低的模块。例如,一些不同的模块中可能存在同一组语句,程序员为了节省空间,把它们抽出来组成一个新模块,这就出现了偶然内聚的模块。很明显,这种模块不易修改和维护,通常情况下应避免构造这种模块。

2) 逻辑内聚

        如果一个模块中包含多个逻辑上相关的功能,每次被调用时,根据传递给该模块的判定参数来确定模块应执行的功能,称作逻辑内聚。

        它属于单入口多功能模块。例如,错误处理模块根据收到的出错信号显示出不同的出错信息等。逻辑模块的修改也比较困难,有时对局部功能的改动也会影响到全局。

3) 时间内聚

        如果一个模块所包含的任务必须在同一时间内执行,称作时间内聚,如初始化模块和终止模块。时间内聚比逻辑内聚好一些,它在一定程度上反映了程序的某些实质,但由于它把许多功能、任务组合在一起,给维护和修改带来了困难。

4) 过程内聚

        如果一个模块内的处理是相关的,而且必须以特定次序执行,则称为过程内聚。           使用程序流程图作为工具设计程序时,常常通过流程图来确定模块的划分,这样得到的就是过程内聚模块。它相对时间内聚的程度更强一些,但由于仅仅为完整功能的一部分,所以内聚程度仍比较低。

5) 通信内聚

        如果一个模块各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称为通信内聚。

        通常,通信内聚模块是通过数据流图来定义的。因为此模块中包含了许多独立的功能,所以它的内聚程度高于过程内聚。但由于各功能部分使用了相同的I/O 缓冲区,从而降低了整个系统的效率。

6) 信息内聚

        如果一个模块能够完成多个功能,各个功能都在同一数据结构上操作,每一项功能有唯一的入口点,称作信息内聚。它可以看作是多个功能内聚模块的组合,并能达到信息的隐蔽,增强了各模块的独立性。

7) 功能内聚

        如果一个模块内各个部分都是完成某一具体功能必不可少的组成部分, 称作功能内聚。此模块间功能明确、耦合简单,是最高程序的内聚。

        事实上,没有必要精确地确定内聚的级别。重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度,降低模块间的耦合程度,从而获得较高的模块独立性。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值