Ian*_*son 7 lines-of-code out code-metrics visual-studio
Visual Studio中的代码度量分析器以及代码度量电源工具,TestMethod将以下代码方法中的代码行数报告为8.
最多,我希望它报告代码行为3.
[TestClass]
public class UnitTest1
{
private void Test(out string str)
{
str = null;
}
[TestMethod]
public void TestMethod()
{
var mock = new Mock<UnitTest1>();
string str;
mock.Verify(m => m.Test(out str));
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么会这样吗?
更多信息
经过一番挖掘后,我发现out从Test方法中删除参数并更新测试代码会导致LOC被报告为2,我认为这是正确的.添加out会导致跳转,因此不是因为大括号或属性.
用dotPeek反编译DLL会显示相当多的额外代码,因为out参数可以被认为是8 LOC,但删除参数和反编译也会显示生成的代码,可以认为是5 LOC,所以它不仅仅是VS的问题计算编译器生成的代码(我不相信它应该做什么).
“代码行”(LOC) 有几种常见的定义。每个人都试图为我认为几乎毫无意义的指标带来一些意义。例如谷歌有效代码行(eLOC)。
我认为 VS 将属性作为方法声明的一部分包含在内,并试图通过计算语句甚至大括号来给出 eLOC。一种可能性是“m => m.Test(out str)”被计为一条语句。
考虑一下:
if (a > 1 &&
b > 2)
{
var result;
result = GetAValue();
return result;
}
Run Code Online (Sandbox Code Playgroud)
和这个:
if (a> 1 && b >2)
return GetAValue();
Run Code Online (Sandbox Code Playgroud)
LOC 的一种定义是计算包含任何代码的行数。这甚至可能包括大括号。在如此极端简单的定义中,计数因编码风格而异。
eLOC 试图减少或消除代码风格的影响。例如,正如这里的情况,声明可以被算作“行”。没有论证,只是解释。
考虑一下:
int varA = 0;
varA = GetAValue();
Run Code Online (Sandbox Code Playgroud)
和这个:
var varA = GetAValue();
Run Code Online (Sandbox Code Playgroud)
两行还是一行?
这一切都取决于意图是什么。如果要测量您需要多高的显示器,那么也许可以使用一个简单的 LOC。如果目的是衡量复杂性,那么计算代码语句(例如 eLOC)可能会更好。
如果您想测量复杂性,请使用复杂性度量,例如圈复杂度。不要担心 VS 如何测量 LOC,因为我认为,无论如何,它都是一个无用的指标。
| 归档时间: |
|
| 查看次数: |
2707 次 |
| 最近记录: |