版权归原作者所有,如有侵权,请联系我们

[科普中国]-内容耦合

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

内容耦合是指如果一个模块与另一个模块的内部属性有关,不经调用直接使用另一个模块的程序代码或内部数据,那么这两个模块之间就存在内容耦合。这种耦合表明一个模块与另一个模块的内部数据或程序代码有关,当一个模块的程序代码被修改或内部数据出错,必然引起另一个模块出错。而对后一模块的出错是很难查出原因的,这样给模块的修改、维护带来极大困难。内容耦合的耦合度最大,为“病态耦合”,在设计时,应避免这种耦合。1

简介当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。如果发生下列情形,两个模块之间就发生了内容耦合

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

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

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

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

内容耦合举例以下是内容耦合的例子:

例子1:模块p修改模块q的一个语句。这个练习不仅限于汇编语言编程,现在,COBOL中已宽容地去掉了alter动词,该动词表示:它修改了另一个语句。

例子2 :根据模块q内部用数字表示的转移,模块p引用模块q的局部数据。

例子3:模块p分支转移到模块q的一个局部标号。

假设模块p和模块q之间内容耦合,许多危险之一是几乎对q的任何修改,甚至用一个新的编译器或汇编器重新编译q,也要求对p进行修改。进一步说,在一个新产品中,如果不重用模块q,则不可能重用模块p。两个模块内容耦合时,它们不可避免地相互连接在一起。2

内聚性在为面向对象系统进行构件级设计时,内聚性意味着构件或者类只封装那些相互关联密切,以及与构件或类自身有密切关系的属性和操作。Lethbridge和Laganiere定义了许多类型的内聚性(按内聚性级别排序。一般来说,内聚性级别越高,构件的实现、测试和维护就越容易)。

1、功能内聚。主要通过操作来体现,当一个模块只完成某一组特定操作并返回结果时,就称此模块是功能内聚的。

2、分层内聚。由包、构件和类来体现。高层能够访问低层的服务,但低层不能访问高层的服务。例如,如果警报响起,SafeHome的安全功能需要打出一个电话。可以定义如下图所示的一组分层包,带阴影的包中包含基础构件。访问都是从Control panel包向下进行的。

3、通信内聚。访问相同数据的所有操作被定义在一个类中。一般来说,这些类只着眼于数据的查询、访问和存储。

那些体现出功能、层和通信等内聚性的类和构件,相对来说易于实现、测试和维护。设计者应该尽可能获得这些级别的内聚性。然而,需要强调的是,实际的设计和实现问题有时会迫使设计者选择低级别的内聚性。

耦合性通信和协作是面向对象系统中的基本要素,然而这个重要(必要)特征存在一个缺陷。随着通信和协作数量的增长(也就是说,随着类之间的联系程度越来越强),系统的复杂性也随之增长了。同时,随着系统复杂度的增长,软件实现、测试和维护的困难也随之增大。

耦合是类之间彼此联系程度的一种定性度量。随着类(构件)相互依赖越来越多,类之间的耦合程度也会增加。在构件级设计中,一个重要的目标就是尽可能保持低耦合。

有多种方法表示类之的耦合,列举如下:

1、内容耦合。当一个构件“暗中修改其他构件的内部数据”时,就会发生这种类型的耦合。这违反了基本设计概念当中的信息隐蔽原则。

2、共用耦合。当大量的构件都要使用同一个全局变量时发生这种耦合。尽管有时候这样做是必要的(例如,设立一个在整个应用系统中都可以使用的默认值),但是当这种耦合发生变更时,会导致不可控制的错误蔓延和不可预见的副作用。

3、控制耦合。当操作A调用操作B,并且向B传递控制标记时,就会发生这种耦合。接着,控制标记将会指引B中的逻辑流程。这种耦合形式的主要问题在于B中的一个不相关变更,往往能够导致A所传递控制标记的意义也必须发生变更。如果忽略这个问题,就会引起错误。3

本词条内容贡献者为:

宋春霖 - 副教授 - 江南大学