类耦合也被称为“对象之间的耦合”(CBO),最初由CK94定义。 基本上,类耦合是单个类使用的类数的度量值。 高数字表示不佳,而低数字通常表示良好,对于这个指标来说。 类耦合已表明是软件故障的准确预测器,最近的研究表明,上限值为 9 是最有效的 S2010。
根据Microsoft文档,类耦合“通过参数、局部变量、返回类型、方法调用、泛型或模板实例化、基类、接口实现、外部类型定义的字段和属性修饰来度量与唯一类的耦合。 良好的软件设计决定了类型和方法应具有较高的凝聚力和低耦合度。 高耦合表明,由于对其他类型的许多相互依赖性,难以重复使用和维护的设计。
耦合和凝聚力的概念显然相关。 为了保持讨论的主题性,除了提供KKLS2000中的简要定义之外,我们不会深入探讨内聚性。
Yourdon 和 Constantine 引入了模块凝聚力,其定义为“模块内部元素之间的紧密绑定或关联程度如何” YC79。 如果模块仅表示一项任务 ,并且其所有元素都促成了此单个任务,则模块具有很强的凝聚力。 它们将凝聚力描述为设计特性,而不是代码,以及可用于预测可重用性、可维护性和可更改性的属性。
类耦合示例
让我们看看类的耦合在作用中的表现。 首先,创建新的控制台应用程序并创建一个名为 Person 的新类,其中包含一些属性,然后立即计算代码指标:
请注意,类耦合为 0,因为此类不使用任何其他类。 现在,使用创建 Person 实例并设置属性值的方法创建另一个名为 PersonStuff 的类。 再次计算代码指标:
您注意到类耦合值如何上升了吗? 另请注意,无论设置多少个属性,类耦合值都会上升 1,而不是由一些其他值上升。 类耦合度量中,每个类无论使用多少次都仅被计入一次。 此外,你可以看到 DoSomething() 的值是 1,而构造函数 PersonStuff() 的值是 0? 目前,构造函数中没有使用另一个类的代码。
如果将代码放入使用另一个类的构造函数中,该怎么办? 以下是你得到的内容:
现在,构造函数清楚地具有使用另一个类的代码,类耦合指标会显示这一事实。 同样,可以看到整体类耦合 PersonStuff() 为 1,DoSomething() 也是 1,这表明无论有多少内部代码在使用它,都仅使用一个外部类。
接下来,创建另一个新类。 请为此类指定一个名称,并在其中创建一些属性。
在PersonStuff类的DoSomething()方法中使用这个类,然后再次计算代码度量:
如你所看到的,PersonStuff 类的类耦合度上升到 2,如果深入分析该类,你可以看到 DoSomething() 方法是耦合度最高的,但构造函数仍然只使用 1 个类。 使用这些指标,可以查看给定类的总最大值,并逐个成员查看详细信息。
神奇数字
与气旋复杂性一样,没有适合所有组织的限制。 但是, S2010 确实指示限制为 9 是最佳的:
因此,我们认为这些阈值是最有效的。 这些阈值(对于单个成员)是 CBO = 9...“。”(强调添加)
Code Analysis
代码分析包括可维护性规则类别。 有关详细信息,请参阅 可维护性规则。 使用旧代码分析时,扩展设计准则规则集包含可维护性区域:
在维护性区域内,有一条关于类耦合的规则。
当类耦合过多时,此规则会发出警告。 有关详细信息,请参阅 CA1506:避免过度类耦合。
引文
CK94
奇达姆伯,S.R. 和凯默勒,C.F. (1994年)。 面向对象的指标设计套件(软件工程的 IEEE 事务,第 20 卷,第 6 版)。 2011年5月14日从匹兹堡大学网站检索到:http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf
KKLS2000
卡拜利、H.、凯勒、R.、卢斯特曼、F.和圣丹尼斯,G.(2000年)。 类凝聚力再研究:工业系统实证研究(面向对象软件工程量化方法研讨会会议论文集)。 检索 2011 年 5 月 20 日,从蒙特利尔大学网站 http://www.iro.umontreal.ca/~sahraouh/qaoose/papers/Kabaili.pdf
SK2003
苏布拉马尼亚姆,R.和克里什南,M.S.(2003年)。 关于面向对象设计复杂性的 CK 指标的实证分析:对软件缺陷的影响(IEEE 软件工程汇刊,第29卷,第4期)。
S2010
沙特纳维,R.(2010年)。 对开源系统中面向对象指标可接受风险水平的定量研究(IEEE 软件工程汇刊,第 36 卷,第 2 期)。
YC79
爱德华·约顿和拉里·康斯坦丁。 结构化设计。 普雷蒂斯·霍尔,恩格尔伍德克利夫斯,N.J.,1979年。