【问题标题】:C# Properties and standard class structural metricsC# 属性和标准类结构度量
【发布时间】:2021-01-14 02:57:49
【问题描述】:

我试图了解如何根据 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;
      }
   }

【问题讨论】:

    标签: c# metrics cohesion


    【解决方案1】:

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

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

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

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

    这是回答in the LCOM/LCOMHS documentation

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

    地点:

    • M 是类中方法的数量(包括静态方法和实例方法,还包括构造函数、属性 getter/setter、事件添加/删除方法)。
    • 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 值对于大型和复杂的类很重要。

    【讨论】:

    • 如果我的数学错了,我深表歉意,但是查看 AI 类有以下数字:M=3(B(或者因为 get 和 set,这算作 2?),MethA,MethB) F=2 (_b, _bx) MF=2 (B -> _b (或者这算 2 因为 get 和 set?), MethB -​​> _bx) LCOM = 1 - 2/6 = 0.67
    • 对于 A 类 M=4 因为还有默认构造函数,即使它没有在源代码中声明。
    • 嗯,如果是这样的话,M * F 是 8,这意味着最终结果是 1 - 2/8 = 0.75。是不是 B 算作 2 个方法(get 和 set),所以我们有 M=5,M*F=10,MF=3(B 算作 2),我们有 1 - 3/10 = 0.7?
    猜你喜欢
    • 2015-03-06
    • 2019-03-16
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2018-12-19
    • 2019-12-28
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多