有没有一种标准的方法来计算在C#语句#
我正在寻找一些代码行长度指标以外的代码行。源监视器报告的内容是语句。这似乎是一件值得了解的事情,但Source Monitor计算某些事情的方式看起来并不直观。例如,for语句是一个语句,即使它包含一个变量定义,一个条件和一个增量语句。如果一个方法调用嵌套在另一个方法的参数列表中,则整个事件被视为一个语句。有没有一种标准的方法来计算在C#语句#
是否有一个标准的方式来陈述陈述,并且是他们的规则来管理这样的事情?
最接近“正式声明”的正式定义是C# specification本身。祝你好运,看看特定工具的测量结果是否与你对规范的阅读一致。
鉴于指标最好用作指南以更好/更差的代码,而不是严格的公式,该工具使用的确切定义有多大的区别?
如果我有三种方法,在“语句长度”为2500,1500和150时,我知道首先要检查哪种方法;另一个工具可能会报告2480,1620和174并不太重要。
我在量度指标方面看到的最好工具之一是NDepend,虽然我不是100%确定它使用的是什么定义。根据网站,NDepend has 82 separate metrics,包括Number of instructions和Cyclomatic Complexity。
指标的第一条规则是“要小心你测量的”。你要求一些陈述,这就是你将要得到的。正如你注意到的那样,这个数字可能实际上并不相关。
如果您对其他测量方法感兴趣,比如“复杂”代码是多少,请考虑查看其他代码度量标准,如循环复杂度。
http://en.wikipedia.org/wiki/Cyclomatic_complexity
UPDATE:回复:您的评论
我同意 “做太多” 是一个有趣的度量。我的经验法则是,一条语句应该有一个副作用(通常是“局部”副作用,如变异局部变量,但有时会出现可见副作用,如写入文件),因此“语句数”应该大致为与该方法在其副作用数量方面“做”的程度相关。
实际上,当然没有人的代码,我自己的代码,实际上始终符合这个标准。你可能会考虑一个度量“这个方法做多少”来计算不仅仅是语句而且也就是说方法调用。
要真正回答您的问题:我不知道任何行业标准规定什么“数量的声明”。 C#规范当然定义了“语句”是词法的,但当然你必须做一些解释来做一个计数。例如:
void M()
{
try
{
if (blah)
{
Frob();
Blob();
}
}
catch(Exception ex)
{ /* eat it */ }
finally
{
Grob();
}
}
M中有多少个语句?那么,M的主体就是一个声明,一个try-catch-finally。答案是什么?尝试的主体包含一个陈述,即“if”陈述。 “if”的结果包含一个陈述 - 记住,一个block是一个陈述。该块包含两个语句。终于包含一个声明。 catch块不包含语句 - 一个捕获块不是语句,在词汇上 - 但它肯定与该方法的操作高度相关!
那么这个共有多少条语句呢?根据你是否将区块计为“真实”的陈述,是否将子陈述考虑为除了他们的父母陈述之外,等等,可以为1到6之间的任何数字作出合理的理由。没有标准的机构来规范我所知道的这个问题的答案。
一个简单的指标就是计算标记之间的标点符号(;
,,
,.
)(以避免字符串,注释或数字中的标点符号)。因此,for (x = 0, y = 1; x < foo.Count; x++, y++) bar[y] = foo[x];
算作6.
的C# Metrics Tool通过使用精确的C#语言的BNF定义定义被计数的事情(“语句”,“操作数”)等。 (实际上,它精确地根据完整的C#语法解析代码,然后通过遍历解析树来计算结构度量值; SLOC通过计数线获得,就像您期望的那样)。
你可能仍然认为这样的定义不直观(语法很少),但它们是精确的。然而,我同意这里的其他海报,确切的衡量标准不像一个代码块相对于另一个代码块的相对价值那么重要。值“173.92”的复杂性本身并不是很有用;对于另一个复杂度值“81.02”,我们可以说有一个很好的迹象表明,第一个比第二个更复杂,这足以提供关注的焦点。
我认为这些指标在趋势分析中也很有用;如果上周这个代码是“81.02”复杂的,本周的广告是“173.92”,我应该想知道为什么在这部分代码中发生了这一切?
您也可以考虑结构性指标来SLOC的比例(例如,圈)作为“做得太多”的指示,或至少编写代码的指示是太密集了解
我确实使用圆环复杂性。我在寻找一个代码长度计数器的原因是复杂性计数不会识别太多的方法,但只有2或3个路径。 – epotter 2010-02-28 04:03:43