耦合与内聚

来源:互联网 发布:网络侦探龙帝 编辑:程序博客网 时间:2024/05/17 00:17

耦合是指两个实体相互依赖于对方的一个量度.分为以下几种:

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

数据耦合:一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。

标记耦合 :一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。

控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。

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

公共耦合:若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。

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

(1) 一个模块直接访问另一个模块的内部数据;

(2) 一个模块不通过正常入口转到另一模块内部;

(3) 两个模块有一部分程序代码重迭(只可能出现在汇编语言中);

(4) 一个模块有多个入口。

耦合强度耦合的强度依赖于以下几个因素:

(1)一个模块对另一个模块的调用;

(2)一个模块向另一个模块传递的数据量;

(3)一个模块施加到另一个模块的控制的多少;

(4)模块之间接口的复杂程度。

耦合按从强到弱的顺序可分为以下几种类型:

(1)内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。

(2)公共耦合。两个以上的模块共同引用一个全局数据项就称为公共耦合。

(3)控制耦合。一个模块在界面上传递一个信号(如开关值、标志量等)控制另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。

(4)标记耦合。模块间通过参数传递复杂的内部数据结构,称为标记耦合。此数据结构的变化将使相关的模块发生变化。

(5)数据耦合。模块间通过参数传递基本类型的数据,称为数据耦合。

(6)非直接耦合。模块间没有信息传递时,属于非直接耦合。

如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免使用内容耦合。 

内聚度是指内部各元素之间联系的紧密程度,模块的内聚种类通常可分为7种,按其内聚度从低到高的次序依此为:

偶然内聚、逻辑内聚、瞬时内聚、过程内聚、通信内聚、顺序内聚、功能内聚。内聚度是前述信息隐藏和局部化概念的自然扩展,它标志一个模块内部各成分彼此结合的紧密程度。  

        内聚度按其高低程度可分为7级,内聚度越高越好。最差的称为偶然内聚(coincidental cohesion)。所谓偶然性内聚是指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系,也很松散。常见的偶然性内聚情形是,当程序员写完一个程序后发现有一组语句多处出现,于是为节省内存便将这组语句单独组成一个模块。

如果一个模块完成的诸任务逻辑上相关(例如,一个模块产生所有与类型无关的输入),则称之为逻辑性内聚(logical cohesion)。

如果一个模块包含的诸任务必须在同一时间段内执行(例如,一个初始化模块),则称之为时间性内聚(temporal cohesion)。  

上述三种内聚形式通常认为是低级内聚,  

中级内聚形式有两种,即过程性内聚(procedural cohesion)和通信性内聚(communicational cohension)。

模块的过程性内聚度是指,模块内成分彼此相关,并且必须按特定的次序执行;

模块的通信性内聚度是指,模块中各成分都将对数据结构的同一区域进行操作,以达到通信的目的。  

高级内聚度也有两种形式,即顺序性内聚(sequential cohesion)和功能性内聚(functional cohesion)。

如果一个模块内的各处理成分均与同一功能相关,且这些处理必须顺序执行,则称为顺序内聚;

如果模块内所有成分形成一个整体,完成单个功能,则称为功能内聚,功能内聚是最高程度的内聚形式;  

设计软件时,应该能够识别内聚度的高低,并通过修改设计尽可能提高模块内聚度,从而获得较高的模块独立性。

0 0
原创粉丝点击