0

我试图了解如何根据 C# 属性计算基本类结构指标,例如 ATFD(访问外部数据)和 LCOM(方法缺乏凝聚力)。

如果一个方法访问另一个类的单个属性,这是否意味着该方法的 ATFD 分数为 1?这会根据是否有支持的私有字段而改变吗?

对于 LCOM,当遵循 NDepend 制定的公式(例如https://www.ndepend.com/docs/code-metrics#LCOM )时,该属性是否算作字段或方法(或两者都算) 。

当我们有一个与属性相关的显式私有字段时,这将如何改变 - 即,以下 A 类和 C 类的 LCOM 差异是什么:

   class A {
      private int _b;
      private int _bx;
      public int B { get { return this._b; }
         set { this._b = value; }
      }

      public void MethodA() {
         B = 1;
      }

      public void MethodB() {
         this._bx = 1;
      }
   }

   class C {
      public int B { get; set; }
      public int Bx { get; set; }

      public void MethodA() {
         B = 1;
      }

      public void MethodB() {
         Bx = 1;
      }
   }
4

1 回答 1

0

我修改了问题中的代码以使其可编译。

使用 NDepend,这 2 个类的值是:

class A   LCOM 0.7  LCOMHS 0.88
class C   LCOM 0.0  LCOMHS 0.0

对于 LCOM,属性算作字段还是算作方法(或两者都算)

在 LCOM/LCOMHS 文档中得到了解答

  • LCOM = 1 – (总和 (MF)/M*F)
  • LCOM HS = (M – sum(MF)/F)(M-1)

在哪里:

  • M 是类中方法的数量(静态和实例方法都被计算在内,它还包括构造函数、属性 getters/setters、事件添加/删除方法)。
  • F 是类中实例字段的数量。
  • MF 是访问特定实例字段的类的方法数。
  • Sum(MF) 是类的所有实例字段的 MF 总和。

建议:LCOM > 0.8 和NbFields > 10 和 NbMethods >10 的类型可能有问题。但是,很难避免这种非内聚类型。应避免使用LCOMHS > 1.0 和NbFields > 10 和 NbMethods >10 的类型。请注意,此约束比 LCOM > 0.8 和 NbFields > 10 和 NbMethods >10 的约束类型更强(因此更容易满足)。


NbFields > 10 和 NbMethods >10被突出显示,因为 LCOM / LCOMHS 值对于大型和复杂的类很重要。

于 2020-09-29T06:38:59.887 回答