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

C# 有没有一种标准的方法来计算C语言中的语句#,c#,metrics,code-metrics,C#,Metrics,Code Metrics,我在看一些代码长度指标,而不是代码行。监视程序报告的源代码是语句。这似乎是一件有价值的事情,但源代码监视器计算某些事情的方式似乎并不直观。例如,For语句是一条语句,即使它包含变量定义、条件和增量语句。如果一个方法调用嵌套在另一个方法的参数列表中,则整个过程被视为一条语句 是否有一种计算语句的标准方法,以及它们的规则是否管理这样的事情?度量的第一条规则是“小心你的度量”。你要的是一些陈述,这就是你要得到的。正如你所注意到的,这个数字可能实际上并不相关 如果你对其他的措施感兴趣,比如“复杂”的代码

我在看一些代码长度指标,而不是代码行。监视程序报告的源代码是语句。这似乎是一件有价值的事情,但源代码监视器计算某些事情的方式似乎并不直观。例如,For语句是一条语句,即使它包含变量定义、条件和增量语句。如果一个方法调用嵌套在另一个方法的参数列表中,则整个过程被视为一条语句


是否有一种计算语句的标准方法,以及它们的规则是否管理这样的事情?

度量的第一条规则是“小心你的度量”。你要的是一些陈述,这就是你要得到的。正如你所注意到的,这个数字可能实际上并不相关

如果你对其他的措施感兴趣,比如“复杂”的代码是什么,考虑一下其他的代码度量,比如循环复杂性。p>

更新:Re:你的评论

我同意“做得太多”是一个有趣的指标。我的经验法则是,一条语句应该有一个副作用(通常是“局部”副作用,比如变异局部变量,但有时是一个可见的副作用,比如写入文件),因此“语句数”应该大致与方法“做”的副作用数量相关

在实践中,当然没有人的代码,包括我自己的代码,实际上一直都符合这个标准。你可能会考虑一个度量“方法所做的”来计数不仅仅是语句,也可以说方法调用。 回答你的问题:我不知道有任何行业标准规定什么是“声明数量”。C#规范当然从词汇上定义了“语句”的含义,但当然,你必须做一些解释才能进行计数。例如:

  void M()
  {
    try
    {
      if (blah)
      {
        Frob();
        Blob();
      }
    }
    catch(Exception ex)
    { /* eat it */ }
    finally
    {
      Grob();
    }
  }
M中有多少语句?M的主体由一个语句组成,一个try-catch-finally。那么答案是什么呢?try的主体包含一条语句,即“if”语句。“if”的结果包含一条语句——记住,块就是一条语句。该块包含两条语句。最后包含一条语句。catch块不包含任何语句——catch块在词汇上不是语句——但它肯定与方法的操作高度相关


那么总共有多少条语句?根据是否将块计算为“真实”语句,是否考虑子语句作为父语句,或不使用父语句,可以从一到六作出任何合理的情况。据我所知,没有一个标准机构来规范这个问题的答案。

最接近于“什么是陈述”的正式定义的是陈述本身。祝您好运,了解特定工具的测量值是否与您对规格的阅读一致

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

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


我见过的度量指标的最佳工具之一是,尽管我也不能100%确定它使用的是什么定义。根据该网站的说法,包括和。

一个简单的指标是只计算标记之间的标点符号(
)(以避免字符串、注释或数字中的标点符号)。因此,
for(x=0,y=1;x
将计数为6。

通过使用精确的C#BNF语言定义来定义要计数的内容(“语句”、“操作数”)等。(事实上,它根据完整的C#语法精确地解析代码,然后通过遍历解析树来计算结构度量;正如您所期望的,SLOC count是通过countline行获得的)

你可能仍然认为这样的定义是不直观的(语法很少),但它们是精确的。然而,我同意这里的其他海报,精确的度量不如一个代码块相对于另一个代码块的相对值重要。“173.92”复杂度值本身并没有多大帮助;与另一个复杂度值“81.02”相比,我们可以说有一个很好的迹象表明第一个比第二个复杂,这足以引起人们的注意

我认为指标在趋势分析中也很有用;如果上周的代码是“81.02”复杂的,而本周的代码是“173.92”,我应该想知道为什么代码的这一部分会发生这样的事情


你也可以考虑一个结构度量(例如,循环)与SLoc的比率,作为“做得太多”的指示,或者至少是写代码太密集而不能理解

的一个指示,我确实使用圈复杂度。我之所以要寻找一个代码长度计数器,是因为复杂度计数不会识别那些做得太多的方法,而是只有2到3条路径。