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