模块
独立
性是软件
质量
的关
键
,
它指
软件系统中的每个模块
只涉
及软件要求的具体子
功能,而和系统中其
他
模块接
口
是简单的。这
样
做不
仅仅便
于软件测试和
维护
,
还
使模块
化程度较高的软件
易
于开发,
尤
其
当
一组开发人员
共
同开发一个软件时,模块化能够分
割
功能,而且接
口
可以简化。
模块的
独立
性可以用两个定性标准度
量
:
耦合和内聚
耦合是模块之间相互连接的紧密程度的度量
。
模块之间的连接越紧密,联系越多,耦 合性就越高
,而其模块
独立
性就
越弱
。
内聚
是一个模块
内
部各个元素
彼此
结合的
紧密
程度
的度
量
。一个模块
内
部各个元素
之
间的
联
系
越紧密
,
内聚
性就
越
高,相对于其
他
模块
之
间
的
耦
合性就
会降
低,而模块
独立
性就
越强
。因
此
,模块
独立
性较
强
的模块应该是高
内聚
低
耦
合的模块。
1、耦合
耦
合的
强弱
取决于各个模块
之
间接
口
的复杂程度、调用模块的方式以及
哪
些
信息
通
过
接
口
。一
般
模块
之
间的
连
接方式有
7
种,构成的
耦
合
也
有
7
种
类型
。
1》非直
接
耦
合
如果两个模块
之
间
没
有
直
接关系,
它们之
间的
联
系完
全
是通
过
主模块的
控
制和调用实
现的,这就是
非直
接
耦
合。
这种耦合的模块独立性最强
。
但
是,在一个软件系统中不可能
所
有的模块
之
间都
无
任何
连
接。
2)
数据
耦
合
如果两个模块
彼此
间通
过
数据
参
数
(
不是
控
制
参
数、
公共
数据结构或
外
部
变量
)
交换
信
息
,这种
耦
合称为数据
耦
合。由于
限
制了
只
通
过参
数表
传递
数据,
所
以
按
数据
耦
合开发的
程序
界面
简单、
安全
可
靠
。数据
耦
合是
松散
的
耦
合,模块
之
间的
独立
性比较
强
,在系统中
必
须
有这
类耦
合。
3)
标
记耦
合
如果模块
之
间通
过参
数表
传递记录信息
,就是标
记耦
合。由于模块
传递
的不是简单
变
量
,而是
某
一数据结构的子结构,
所
以在设计中应
避免
这种
耦
合。
4)
控
制
耦
合
如果模块
传递
的
信息
中有
控
制
信息
,就称作
控
制
耦
合。这种
耦
合的实
质
是在单一接
口
上选择
多
功能模块中的
某项
功能。因
此
,对
被控
制模块的任何
修改
,都
会影响控
制模块。
控
制
耦
合
属
于中等程度的
耦
合,
它增加
了系统的复杂程度。
5)
公共耦
合
如果一组模块通
过
同一个
公共
数据
环境
相互作用,则
它们之
间的
耦
合称为
公共耦
合。
公共
的数据
环境
可以是
全局
数据结构、
共享
的通
信区
、
内存
的
公共覆盖区
、任何
存储介质
上的文件、物理设备等。
6)
内容耦
合
如果发生下列
情形之
一,两个模块
之
间就发生了
内容耦
合。
一个模块
直
接
访
问
另
一个模块的
内
部数据。
一个模块不能通
过正
常入
口
转
到另
一模块的
内
部。
两个模块有一部分程序代码
重叠
(
只
可能出现在
汇
编
语言
中
)
。
一个模块有
多
个入
口
。
内容耦合属于最高程度的耦合,应该尽量避免使用。
7)
外
部
耦
合
如果一组模块都
访
问同一
全局
简单
变量
而不是同一
全局
数据结构,而且不是通
过参
数
表
传递
该
全局变量
的
信息
,则称为
外
部
耦
合。
2、内聚
内聚
是一个模块
内
部各个元素
彼此
结合的
紧密
程度的度
量
。一个
内聚
程度高的模块应
当
完成软件
过
程中的单一任务。
它
是
信息隐蔽
概
念
的一种自然
扩展
。一
般
模块的
内聚
性
也
有
7
种
类型。
1)
偶
然
内聚
如果一个模块各部分之间没有关系,或者即使有关系,这种关系也是很松散的,则称 作偶然内聚。
它
是
内聚
程度最低的模块。
例
如,一些不同的模块中可能
存
在同一组
语句,
程序员为了
节省空
间,把
它们抽
出来组成一个
新
模块,这就出现了
偶
然
内聚
的块。
很
明
显
,这种模块不
易修改
和
维护
,通常
情况
下应
避免
构
造
这种模块。
2)
逻辑
内聚
如果一个模块中包
含多
个逻辑上相关的功能,每次
被
调用时,根据
传递
给该模块的
判
定
参
数来确定模块应
执
行的功能,称作逻辑
内聚
。
它属
于单入
口多
功能模块。
例
如,
错误
处理模块根据
收到
的出
错信号显示
出不同的出
错信息
等。逻辑模块的
修改也
比较
困难
,有
时对
局
部功能的
改动也会影响到全局
。
3)
时间
内聚
如果一个模块
所
包
含
的任务必
须
在同一时间
内执
行,称作时间
内聚
,如
初始
化模块和
终
止
模块。时间
内聚
比逻辑
内聚
好一些,
它
在一定程度上
反映
了程序的
某
些实
质
,
但
由于
它
把
许多
功能、任务组合在一
起
,给
维护
和
修改带
来了
困难。
4)
过
程
内聚
如果一个模块
内
的处理是相关的,而且必
须
以
特
定次序
执
行,则称为
过
程
内聚
。使用
程序流程图作为工具设计程序时,常常通
过
流程图来确定模块的划分,这
样
得
到
的就是
过
程
内聚
模块。
它
相对时间
内聚
的程度
更强
一些,
但
由于
仅仅
为完
整
功能的一部分,
所
以
内
聚
程度
仍
比较低。
5)
通
信内聚
如果一个模块各功能部分都使用了相同的
输
入数据,或产生了相同的
输
出数据,则称
为通
信内聚
。通常,通
信内聚
模块是通
过
数据流图来定义的。因为
此
模块中包
含
了
许多独
立
的功能,
所
以
它
的
内聚
程度高于
过
程
内聚
。
但
由于各功能部分使用了相同的
I/O
缓冲区,
从而
降
低了
整
个系统的效
率
。
6)
信息内聚
如果一个模块能够完成
多
个功能,各个功能都在同一数据结构上
操
作,每一
项
功能有
唯
一的入
口
点,称作
信息内聚
。
它
可以
看
作是
多
个功能
内聚
模块的组合,并能
达到信息
的
隐蔽
,
增强
了各模块的
独立
性。
7)
功能
内聚
如果一个模块
内
各个部分都是完成
某
一具体功能必不可
少
的组成部分,称作功能
内聚。
此
模块间功能明确、
耦
合简单,是最高程序的
内聚。
设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度,降低模块间的耦合程
度,从而获得较高的模块独立性。