评估 Java 程序的 MOOD 因素

17 Mar 2025 | 6 分钟阅读

应用程序质量对于软件系统的开发至关重要,尤其是大型系统。高质量的软件可以降低软件维护成本,并提高软件的可重用性。

为了更定量、客观地衡量软件质量,软件度量(MOOD)似乎是一种强大有效的方法,可以为面向对象应用程序评定等级。因此,在本节中,我们将讨论用于评估面向对象应用程序的 mood 因素

MOOD Factors to Assess a Java Program

MOOD 代表 面向对象设计的度量 (Matrices for Object Oriented Design)。它描述了面向对象应用程序或程序的特征。它用于评估 Java 程序的等级。MOOD 因素包括以下六个软件质量指标或度量:

  • 方法隐藏因子 (MHF)
  • 属性隐藏因子 (AHF)
  • 方法继承因子 (MIF)
  • 属性继承因子 (AIF)
  • 耦合因子 (COF)
  • 多态因子 (POF)

信息隐藏因子

MHF 和 AHF 是封装机制支持的信息隐藏概念使用情况的度量。应使用信息隐藏来:

  1. 通过将复杂组件视为“黑盒”来处理复杂性。
  2. 减少因实现改进而引起的“副作用”。
  3. 支持自顶向下的方法。
  4. 增量地测试和集成系统。

方法隐藏因子 (MHF)

可以使用以下数学公式计算 MHF:

MOOD Factors to Assess a Java Program

其中,

Mh(Ci) = 类 Ci 中隐藏的方法数

Md(Ci) = Mv(Ci) + Mh(Ci):类 Ci 中定义的方法数

Mv(Ci):类 Ci 中可见的方法数

TC:类的总数

可见方法度量类的功能。提高类的整体功能会降低 MHF。为了实现此功能,必须采用自顶向下的方法。这意味着类实现必须是一个逐步分解的过程,这样我们就可以在隐藏方法中添加越来越多的细节,从而提高 MHF。

非常低的 MHF 值表示实现了不够抽象的方法。相反,高的 MHF 值表示功能很少。因此,MHF 值应介于 2、3 和 4 之间。

属性隐藏因子 (AHF)

可以使用以下数学公式计算 AHF:

MOOD Factors to Assess a Java Program

其中,

Ah(Ci) = 类 Ci 中隐藏的属性数

Ad(Ci) = Av(Ci) + Ah(Ci):类 Ci 中定义的属性数

Av(Ci):类 Ci 中可见的属性数

TC:类的总数

AHF 是封装机制支持的信息隐藏概念使用情况的度量。信息隐藏允许通过将复杂组件视为“黑盒”来处理复杂性。应尽可能多地使用 AHF。理想情况下,所有属性都应隐藏,只通过相应的类方法进行访问。非常低的 AHF 值应引起设计者的注意。通常,随着 AHF 的增加,程序的复杂性会降低 2、3 和 4。

继承因子

MIF 和 AIF 都是继承的度量。继承是一种表达类之间相似性的机制,它允许通过重用来表示泛化和特化关系,以及简化继承类的定义 [2,3,4,5]。

方法继承因子 (MIF)

可以使用以下数学公式计算 MIF:

MOOD Factors to Assess a Java Program

其中,

Mi继承的方法数

Ma(Ci) = Md(Ci) + Mi(Ci):类 Ci 中定义的属性数

Md(Ci):定义的方法数

TC:类的总数

乍一看,我们可能会认为继承应该被广泛使用。然而,多个继承关系构成的有向无环图(继承层次结构树),其深度和宽度会迅速导致可理解性和可测试性下降 [1,2,3,4]。

属性继承因子 (AIF)

可以使用以下数学公式计算 AIF:

MOOD Factors to Assess a Java Program

其中,

Ah(Ci) = 类 Ci 中隐藏的属性数

Ad(Ci) = Av(Ci) + Ah(Ci):类 Ci 中定义的属性数

Av(Ci):类 Ci 中可见的属性数

TC:类的总数

耦合因子 (COF)

它度量类之间的耦合。

可以使用以下数学公式计算 COF:

MOOD Factors to Assess a Java Program

其中,

is_client(Cc,Cs) =| 1 如果 (Cc⇒Cs)^(Cc≠Cs),否则为 0

TC:表示类的总数。

客户端-供应商关系,表示为 Cc ⇒ Cs,意味着 Cc(客户端类)至少包含一个非继承的对类 Cs(供应商类)的特征(方法或属性)的引用。COF 的分子表示实际的耦合数量,这些耦合不应归因于继承 2、3、4 和 6。

理想情况下,类应该与尽可能少的其他类通信,并交换尽可能少的信息。耦合关系会增加复杂性、减少封装和潜在重用,并限制可理解性和可维护性。此外,软件系统中的耦合对软件质量有很强的负面影响,因此在设计阶段应将其降至最低。然而,对于给定的应用程序,类必须协作以提供某种功能。因此,COF 预计会有下限 2、3 和 4。

多态因子 (POF)

多态意味着具有多种形式的能力。在面向对象系统中,多态允许给定操作的实现依赖于“包含”该操作的对象 2、3、4 和 6。

MOOD Factors to Assess a Java Program

其中,

Mo(Ci):类 Ci 中重写的方法数

Mn(Ci):类 Ci 中新增的方法数

DC(Ci):类 Ci 的后代数量(派生类)

TC:类的总数

POF 的分子表示实际可能的多态情况数量。发送到类 Ci 的给定消息可以绑定到命名的方法实现(在统计上或动态地),该实现可能具有与该相同方法在其(Ci 后代中)被重写的次数相同的形状 2、3、4。

多态源于继承。将一个公共消息调用绑定(通常在运行时)到同一层次结构中的多个类之一,被认为可以减少复杂性并允许在不产生副作用的情况下改进类层次结构。另一方面,通过跟踪控制流来调试这样的层次结构,这个多态性会使工作变得更难。因此,多态性应该被限制在某个范围内 2、3、4。

MOOD 因素的评估

授予面向对象程序的等级取决于以下基于实验的表格。

MOOD 因素的范围
因素最小值最大值最小容差最大容差
MHF12.7%21.8%9.5%36.9%
AHF75.2%100%67.7%100%
MIF66.4%78.5%60.9%84.4%
AIF52.7%66.3%37.4%75.7%
COF0%11.2%0%24.3%
POF2.7%9.6%1.7%15.1%

最终等级的计算步骤如下:

步骤 1:对所有指标执行以下操作:

如果指标值在指定范围内,则 等级 = 100%

否则,如果指标值在容差范围内,则 60%≤等级 通过插值计算。

否则,如果指标超出容差范围,则 等级 < 60% 通过插值公式计算,系统应引起程序员对问题的注意。

MOOD Factors to Assess a Java Program

其中,

GRADE [i]:指标 i 的等级。

W[i]:分配给指标以反映其重要性的权重值。

n:因素的数量,n=6。

MOOD Factors to Assess a Java Program

其中,

最终等级:表示评估的面向对象程序的最终等级 [0:100]。

TW:表示可以通过以下公式计算的总权重

MOOD Factors to Assess a Java Program

其中,

n:指标总数,n=6。

W(Fi):指标 i 的权重。

每个指标的等级从 0% 到 100% 不等。为每个指标分配权重以反映其重要性。六个指标的分类显示在下表中。此表根据报告的研究 2、3、4、5 和 6 生成。

MOOD 因素的重要性
因素重要性权重
AHF1
MHF2
MIF2
AIF1
COF3
POF2

让我们考虑以下设计模式并使用 MOOD 因素评估它们的等级。

MOOD Factors to Assess a Java Program

让我们评估上述设计模式的等级。

因素模型程序已评估程序因素权重最终等级
下限上限得分等级 (%)
MHF12.721.82.30158%
AHF76.0100.0100.01002
MIF66.478.545.57103
AIF52.766.344.44801
COF4.011.20.01003
POF2.79.622.22302

基于以上评估,我们推荐以下内容:

  • 隐藏更多方法。
  • 应增加继承方法的数量。
  • 应减少多态的使用。

我们观察到每个 MOOD 因素都与面向对象模型的基本结构机制相关。正是这些机制为设计者提供了一些建议。

每个 MOOD 因素的区间已经根据实验结果进行了修改,以适应 Java 程序的评估。权重因子反映了每个特征的重要性。