有没有一种标准的方法来计算C#中的语句

epo*_*ter 4 c# metrics code-metrics

我正在查看除代码行之外的一些代码长度指标.Source Monitor报告的内容是语句.这似乎是一件值得知道的事情,但Source Monitor计算某些东西的方式似乎不直观.例如,for语句是一个语句,即使它包含变量定义,条件和增量语句.如果方法调用嵌套在另一个方法的参数列表中,则整个事物被认为是一个语句.

是否有一种标准的方式来计算陈述,并且是他们管理这种事情的规则?

Eri*_*ert 7

指标的第一条规则是"小心你衡量的东西".你要求一份陈述,这就是你要得到的.如你所知,这个数字可能实际上并不相关.

如果您对其他度量感兴趣,例如"复杂"代码的方式,请考虑查看其他代码度量标准,例如周期性复杂性.

http://en.wikipedia.org/wiki/Cyclomatic_complexity

更新:回复:你的评论

我同意"做太多"是一个有趣的指标.我的经验法则是,一个语句应该有一个副作用(通常是"局部"副作用,如改变局部变量,但有时是可见的副作用,如写入文件),因此"语句数"应大致相同与该方法在副作用数量方面"做"的程度相关.

在实践中,当然没有人的代码(包括我自己的代码)实际上始终符合该条形码.您可以考虑"方法正在做多少"的度量标准,不仅可以计算语句,还可以计算方法调用.

要真正回答你的问题:我不知道任何行业标准来规定"声明数量"是什么.C#规范无疑定义了词条的"声明",但当然你必须做一些解释来计算.例如:

  void M()
  {
    try
    {
      if (blah)
      {
        Frob();
        Blob();
      }
    }
    catch(Exception ex)
    { /* eat it */ }
    finally
    {
      Grob();
    }
  }
Run Code Online (Sandbox Code Playgroud)

M有多少陈述?好吧,M的主体由一个声明组成,一个试试 - 最终.答案是这样的吗?try的主体包含一个语句,一个"if"语句."if"的结果包含一个语句 - 记住,块是一个语句.该块包含两个语句.最后包含一个声明.catch块不包含任何语句 - 一个catch 不是一个语句,而是词法 - 但它肯定与该方法的操作高度相关!

那么总共有多少陈述呢?人们可以为1到6之间的任何数字做出合理的判断,这取决于你是否将块计为"真实"语句,是否将子语句视为父语句之外的其他数字,等等.没有标准机构来规范我所知道的这个问题的答案.


Bev*_*van 6

您最接近"什么是声明"的正式定义将是C#规范本身.祝你好运,确定特定工具的测量是否与您对规格的读数一致.

鉴于指标最好用作更好/更差代码的指南,而不是严格的公式,该工具使用的确切定义是否会产生很大差异?

如果我有三种方法,"语句长度"为2500,1500和150,我知道我将首先检查哪种方法; 另一个工具可能报告2480,1620和174并不太重要.

我见过的测量指标的最佳工具之一是NDepend,但我再也不能100%确定它正在使用什么定义.根据该网站,NDepend有82个单独的指标,包括指令数Cyclomatic Complexity.