Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#属性和标准类结构度量_C#_Metrics_Cohesion - Fatal编程技术网

C#属性和标准类结构度量

C#属性和标准类结构度量,c#,metrics,cohesion,C#,Metrics,Cohesion,我试图理解如何根据C#属性计算基本类结构度量,例如ATFD(访问外来数据)和LCOM(方法中缺乏内聚性) 如果一个方法访问另一个类的单个属性,这是否意味着该方法的ATFD分数为1?是否根据是否存在支持私有字段而改变 例如,对于LCOM,当遵循NDepend列出的公式时,属性是否算作字段或方法(或两者兼而有之) 当我们有一个与地产相关的显式私有字段时,这种情况会发生什么变化?即,以下A类和C类的LCOM差异是什么: class A { private int _b;

我试图理解如何根据C#属性计算基本类结构度量,例如ATFD(访问外来数据)和LCOM(方法中缺乏内聚性)

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

例如,对于LCOM,当遵循NDepend列出的公式时,属性是否算作字段或方法(或两者兼而有之)

当我们有一个与地产相关的显式私有字段时,这种情况会发生什么变化?即,以下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;
      }
   }
我修改了问题中的代码以使其可编译

对于NDepend,这两个类的值为:

class A   LCOM 0.7  LCOMHS 0.88
class C   LCOM 0.0  LCOMHS 0.0
对于LCOM,属性是作为字段还是作为方法(或同时作为两者)计算的

答案是这样的

  • LCOM=1–(总和(MF)/M*F)
  • LCOM HS=(M–总和(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值主要对大型复杂类而言非常重要。

如果我的数学错误,我深表歉意,但看看A类,我有以下数字:M=3(B(或者由于get和set,这算是2吗?),MethA,MethB)F=2(_B,_bx)MF=2(B->B)(或者是因为get和set而将其计算为2?),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?