4

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

是否有一种标准的方式来计算陈述,并且它们的规则是否适用于这种事情?

4

4 回答 4

7

度量的第一条规则是“小心你测量的东西”。您要求对陈述进行计数,这就是您将要得到的。正如您所指出的,该数字可能实际上并不相关。

如果您对其他度量感兴趣,例如“复杂”代码的程度,请考虑查看其他代码度量,例如循环复杂度。

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

更新:回复:您的评论

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

在实践中,当然没有人的代码,包括我自己的代码,实际上一直都符合那个标准。您可能会考虑一个衡量“方法执行了多少”的指标,不仅可以计算语句,还可以计算方法调用。

要实际回答您的问题:我不知道有任何行业标准来规范“声明数量”是什么。C# 规范当然在词法上定义了“语句”是什么,但是当然你必须做一些解释才能进行计数。例如:

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

M中有多少条语句?嗯,M 的主体由一个语句组成,一个 try-catch-finally。那么答案是一个吗?try 的主体包含一个语句,一个“if”语句。“if”的结果包含一个语句——记住,一个块就是一个语句。该块包含两个语句。finally 包含一个语句。catch 块不包含语句——从词法上讲,catch不是语句——但它肯定与方法的操作高度相关!

那么一共有多少个语句呢?可以为从 1 到 6 的任何数字提出合理的案例,这取决于您是否将块视为“真实”语句,您是否将子语句视为其父语句的补充,等等。据我所知,没有标准机构来规范这个问题的答案。

于 2010-02-28T03:23:27.970 回答
6

最接近“什么是语句”的正式定义可能是C# 规范本身。祝您好运,确定特定工具的测量值是否与您对规范的阅读一致。

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

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

我见过的用于衡量指标的最佳工具之一是NDepend,尽管我再次不能 100% 确定它使用的是什么定义。根据该网站,NDepend 有 82 个独立的指标,包括指令数循环复杂度

于 2010-02-28T03:47:49.337 回答
3

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

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

我认为指标在趋势中也很有用;如果上周这段代码是“81.02”复杂,本周广告是“173.92”,我想知道为什么这部分代码会发生这种情况?

您还可以将结构度量(例如,Cyclomatic)与 SLOC 的比率视为“做得太多”的指示,或者至少表明编写的代码过于密集而无法理解

于 2010-02-28T18:28:34.950 回答
1

一个简单的度量标准是只计算标记之间的标点符号(;, ,, .)(以避免字符串、注释或数字中的标点符号)。因此,for (x = 0, y = 1; x < foo.Count; x++, y++) bar[y] = foo[x];将计为 6。

于 2010-02-28T17:12:15.827 回答