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

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

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

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

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

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

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

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

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

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的主体包含一个语句,一个“if”语句。 “if”的结果包含一个语句 – 记住,块是一个语句。 该块包含两个语句。 最后包含一个声明。 catch块不包含任何语句 – catch 不是语句 ,而是词法 – 但它肯定与方法的操作高度相关!

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

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

你可能仍然认为这样的定义不直观(语法很少),但它们是精确的。 但是,我同意其他海报的确切措施并不像一个代码块相对于另一个代码的相对价值那么重要。 值“173.92”的复杂性本身并不是很有用; 与另一个复杂度值“81.02”相比,我们可以说有一个很好的迹象表明第一个比第二个更复杂,这足以提供关注的焦点。

我认为指标在趋势中也很有用; 如果上周这个代码是“81.02”复杂,本周广告它是“173.92”,我应该想知道为什么这部分代码都发生了?

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

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