耦合度模型的建立

时间:2022-05-29 05:00:17

摘要:该文从影响耦合度的因素出发,对其分析研究,给出度量模块耦合度的计算公式并建立模型。

关键词:模块;耦合度

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)36-2805-03

Coupling Degree Measure Model

ZHENG Lu-liang

(Fujian Medical University, Fuzhou 350001, China)

Abstract: Starting from the factors influencing the coupling degree, this article analyses and research them, puts forward the computing formula for measuring module coupling degree.

Key words: Module; coupling degree

1 引言

传统的软件度量学和当时的面向功能分解的设计方法相联系,大多以模块度量为主。Yourdon和Constantine提出影响软件质量的主要因素:耦合性、内聚性、复杂性、模块化及规模大小.Froy和Zweben利用软件模块结构图进行分析,从中提取21个特性作为度量依据,它们是模块间传递数据量的最大值、平均值、总数,公用数据数目,扇入、扇出平均值和最大值、条件调用、循环调用数目及最大深度(层数)等。面向对象技术采用数据抽象、封装、继承、多态性、信息隐藏、重用等机制,增强了软件可维护性、可靠性,提高了生产效率等。由于面向对象设计与面向功能分解的传统设计的巨大差异,传统的软件度量方法无法适应面向对象技术.数据抽象、封装、继承、多态性、信息隐藏、重用机制等新概念的出现,必然需要新的面向对象软件的度量学理论和方法来与之适应。

2 模块

面向对象设计就是基于四个重要的软件设计概念-抽象、信息隐蔽、功能独立性、模块性建造系统的能力,所有的设计方法均力图建造有这些基本特征的软件,面向对象设计可分为两个阶段,即高层设计和低层设计。高层设计建立应用的体系结果,低层设计集中于类的详细设计,面向对象设计的必需步骤是划分模块,而划分模块的原则是高内聚度低耦合度。

目前,几乎所有的软件体系结构都体现了模块化的思想,即把软件划分为可独立命名和编址的部件,每个部件称为一个模块,每个模块都完成一个子功能,当把所有模块组装到一起就成为一个整体时,便可以完成指定的功能。模块是数据说明、可执行语句等程序对象的集合,它是单独命名的而且可通过名字来访问的。例如,过程、函数、宏、子程序等等都可作为模块。而模块化就是把程序划分成若干个模块,各个击破。(模块是具有一定功能的可以用名词调用的程序语句集合)。

对于一个给定的问题,当模块总数增加时,每个模块的规模将减少,开发单个模块需要的成本(工作量)确实减少了;但随着模块数目的增加,设计模块间的接口所需代价却将增加,致使软件总耗费呈一抛物线。因为,实际上,模块的大小与模块的复杂性直接成正比,模块划分小了,每个模块的复杂性就下降,成本下降;但是增加了模块之间接口的复杂性。所以对每一问题都存在着某个最佳模块的数目,它能使软件成本最小。

那么,怎样保证模块数,使得可以获得最小开发成本呢?到底要依据什么标准划分模块?这些问题就将涉及到信息隐藏、内聚与耦合的概念。读者可以自己去查询相关书籍。

在当今软件业中,存在一些有关耦合度的度量,如CK度量方法和MOOD度量方法。其中,在CK度量方法中,它是从类的角度对程序的面向对象特征进行度量,它将对象类之间的耦合CBO(Coupling Between Object Classes)定义成某个类使用其他类的属性或方法的次数,也就是说一个类的CBO是它与其它类有耦合关系的类的数目。若CBO越大,则类的可重用性可能减弱,且修改和测试越复杂,但实际上存在多种不同的耦合关系,它们对软件质量的影响也不尽相同,对有耦合关系的两个类的影响也是不一样的。C&K的耦合度定义对这些进行了简化,这虽然使得耦合度的意义变得有些模糊,但使得这个指标的计算方便了许多。在MOOD度量方法中,它是从面向对象系统的角度对程序的面向对象特征进行度量,对耦合性的度量可以通过对耦合因子CF(Coupling Factor)进行度量来表示。CF定义如下:

CF表示系统中所有类间的耦合程度,其值在0~1之间。若CF越大,则类间发生耦合越频繁。

由于面向对象软件度量仍处于发展阶段,这些方法仅揭示了软件的内部属性,如文本、数据流、控制流等特性,其结果还未与软件的外部属性,如复杂性、可理解性、可维护性和可测试性等建立起对应关系,因此本文就对耦合度的度量进行深入研究,从软件的内部属性出发,给出另一种度量面向对象耦合度的模型。

3 耦合度度量模型的建立

学习过软件工程的人都知道,模块跟模块之间的信息传递是通过全局变量、公共内存、文件、模块的接口、消息来进行的。这些方式在传递信息的时候,比较容易产生耦合,且产生耦合的方式和大小也不尽相同。下面来详细阐述它们产生耦合的方式及其影响的情况。

3.1 影响因素

1) 模块与模块间是通过全局变量来传递信息的情况。我们对全局变量的操作一般可以分为以下两种:赋值和读取数据的操作。当两个模块同时对同个全局变量操作的时候,则这两个模块之间就会出现耦合,这种耦合是属于外部耦合的。所以在全局变量影响的情况下,就会存在以下几种情况会产生耦合:①赋值-读取,即一个模块在对全局变量进行赋值操作,而另一个模块却是对它进行读取操作;②赋值-赋值,即一个模块对全局变量进行赋值操作,而另一个模块也对它进行赋值操作;③读取-读取。即一个模块对全局变量进行读取操作,另一个模块也对它进行读取操作。

2) 模块与模块间是通过公共内存来传递信息的情况。类似的,我们对公共内存的操作也可以分为以下三种形式:读取、写入、释放的操作。当两个模块同时对公共内存进行操作的时候,模块间就会产生耦合。这种耦合是属于公共耦合的。所以在公共内存操作的时候,就会存在以下几种产生耦合的情况:①读取-写入;②读取-读取;③写入-写入;④读取-释放;⑤写入-释放;⑥释放-释放;(上述几种情况所产生耦合的方式跟(1)中情况类似,这里不再一一阐述);

3) 模块与模块间是通过文件来传递信息的情况。在系统中需要处理的文件一般有三种:文本文件、有类型文件和二进制文件。文本文件顾名思义,即包含了可被任意文本编辑器读取的ASCII文本。有类型文件是包含了程序员所定义的数据类型的文件。二进制文件则包含了其它所有的类型,它是对包含任意格式或无格式数据的文件的统称。要打开文件的方式有三种:一是用Rewrite()过程创建并打开一个文件。如果对一个已存在的文件使用的Rewrite()过程,则该文件将被覆盖。二是通过用Reset()过程以只读方式打开一个文件。三是用Append()过程向已存在的文件中追加文本。要从无类型文件中读取数据,可以调用BlockRead()的函数。要写数据,可以调用BlockWrite()的函数。我们对文件的有如下的操作:读取、写入、释放;所以相应它们也有如下几种情况会产生耦合,这种耦合为标记耦合。情况如下:①读取-写入;②读取-读取;③写入-写入;④读取-释放;⑤写入-释放;⑥释放-释放;(上述几种情况所产生耦合的方式跟(1)中情况类似,这里不再一一阐述);

4) 模块与模块间是通过模块的接口来传递信息的情况。接口(Interface)中定义了一些过程和函数,用于与一个对象交互。定义接口实际上就是实现接口。我们对接口的操作只有调用,所以模块与模块间会产生耦合的情况就是两个不同模块同时调用同个函数或过程等。这种耦合是属于内容耦合,耦合度最高。

5) 模块与模块间是通过消息来传递信息的情况。所谓的消息,是指Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键,都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录包含了诸如消息的类型以及其它的信息。消息常量由TMsg记录的message域来传递。这些常量是在Message单元中定义。消息常量往往以字母WM打头,即Windows message的缩写。除了通用的Tmessage记录外,Delphi为每个Windows消息定义了一个特殊的消息记录,这样您就不必从Wparam域和Lparam域中分解出有关消息。这些特殊的记录可以在Messages单元中找到。消息记录的命名是在消息标识符的前面加上大写字母T并去掉下划线。我们对消息有如下的操作:发送、接收;所以就有下列几种情况会产生耦合:①发送-接收;②发送-发送;③接收-接收;(上述几种情况所产生耦合的方式跟(1)中情况类似,这里不再一一阐述);这种耦合是属于数据耦合,耦合度较低。

在软件工程学中,耦合度从强到弱的顺序为:内容耦合、公共耦合、外部耦合、标记耦合、数据耦合。上述几种因素依据其产生耦合度的类别,很容易知道上述几种因素对耦合度的影响从高到低分别为:模块接口、公共内存、全局变量、文件、消息。为了下面能够更好地对耦合度进行量化,我们首先将耦合度最高的定义为1,最低的定义为0,其它情况就为(0,1)之间的数。因此我们给以上几种情况进行权重分配。

具体权重分配如下:

①如果模块间是通过消息来传递信息,我们将赋予权重为0.2,其中对消息进行的操作的权重就定义为(0,0.2)之间的值;②如果模块间是通过文件来传递信息,则将其权重定为0.4,其中对文件进行的操作的权重就定义为(0.2,0.4)之间的值;③同样,如果模块间是通过全局变量来传递信息,则赋予权重为0.6,其中各个模块对全局变量进行的操作的权重就定义为(0.4,0.6)之间的值;④如果模块间是通过公共内存来进行信息传递,那我们对它赋予权重为0.8,其中对公共内存的操作就定义为(0.6,0.8)之间的值;⑤如果模块间是通过模块接口来进行信息传递,那我们将其权重定义为1,那么对它的操作的权限就定义为(0.8,1)之间的值。

考虑到各种因素当中的操作对耦合度的影响不同,我们对这些操作进行权重分配,具体权重分配如下:

消息:发送-发送操作的权重为0.1;接收-接收操作的权重为0.05;发送-接收操作的权重为0.15;

文件:读取-写入操作的权重为0.3;读取-读取操作的权重为0.25;写入-写入操作的权重为0.35;读取-释放操作的权重为0.22;写入-释放操作的权重为0.22;释放-释放操作的权重为0.2;

全局变量:赋值-取值操作的权重为0.55,赋值-赋值操作的权重为0.50,取值-取值操作的权重为0.42;

公共内存:写入-写入操作的权重为0.78;读取-读取操作的权重为0.7;读取-写入操作的权重为0.75;读取-释放操作的权重为0.65;写入-释放操作的权重为0.65;释放-释放操作的权重为0.6;

模块接口:调用-调用操作的权重为0.98;

对上述操作进行权重分配,是为了能够更深入地对耦合度进行量化,以得到一个计算耦合度的公式。

3.2 耦合度的定义

通过以上的分析,现在我们就将耦合度的度量定义如下:

1) 模块本身与本身的耦合度最高定为1;

2) 模块与其它模块之间没有一点关系,则耦合度最低定为0;

3) 其它情况的耦合度就定义在(0,1)之间的值;

也就是说,假设在一个系统中,如果有m个模块,那么它们之间的耦合度的值就可以用一个m×m的矩阵R来表示

即:

其中:

其中:c 为第i个对象和第j个对象之间的第L个因素中第k个关系的个数,m 为第i个对象和第j个对象之间的第L个因素中第k个关系的权重。S表示第L个因素中的关系个数;n 为第L个因素的权重。

4 结束语

本文重点介绍了面向对象耦合度度量模型的建立。应用数学的方法建立了耦合度度量模型,并将耦合度进行了量化。

参考文献:

[1] 孙涌,徐汀荣.现代软件工程[M]. 北京:北京希望电子出版社,2002.7.

[2] 李心科,刘宗田,潘飚. 一个面向对象软件度量工具的实现和度量使用研究[J]. 计算机学报,2000,23(11):1220-1225.

[3] Briand LionelC.,DalyJohnW.,Wust JurgenK,A Unified Frameworkfor coupling Measurement in objedt-Oriented Systems[J].IEEE Transcationon software Engineering,1999(1):991-116.

注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”

上一篇:基于双约简的GMM说话人辨识 下一篇:句子相似度计算模型的改进