c# - 圈复杂度为 31,这是从哪里来的?

标签 c# code-analysis fxcop cyclomatic-complexity

我正在开发一个从 Excel 文件中提取数据的应用程序(我无法访问实际的数据库)并且我编写了一个方法,该方法的唯一功能是从 Excel 电子表格中提取数据,如下所示。

private IEnumerable<SMEntity> ExtractSMData(List<MSExcel.Range> SMData)
{
    List<SMEntity> SMEntities = new List<SMEntity>();

    foreach (MSExcel.Range Row in SMData)
    {
        SMEntity entity = new SMEntity();
        entity.IncidentNumber = Row.get_Range("K1").get_Value();
        entity.SRNumber = Row.get_Range("L1").get_Value();
        entity.SRCategory = Row.get_Range("M1").get_Value();
        entity.SiebelClientCall = EntityConversions.DateTimeConversion(Row.get_Range("N1").get_Value());
        entity.SiebelOpenedDate = EntityConversions.DateTimeConversion(Row.get_Range("O1").get_Value());
        entity.IncidentOpenDate = EntityConversions.DateTimeConversion(Row.get_Range("P1").get_Value());
        entity.PickedUpBeforeClient = Row.get_Range("Q1").get_Value().ToString().ToLowerCase() == "no" ? false : true;
        entity.OutageStartTime = EntityConversions.DateTimeConversion(Row.get_Range("R1").get_Value());
        entity.DetectionPoint = EntityConversions.DateTimeConversion(Row.get_Range("S1").get_Value());
        entity.SecondsToDetection = EntityConversions.ConvertDetectionTimeToInt(Row.get_Range("T1").get_Value());
        entity.OutageEndTime = EntityConversions.DateTimeConversion(Row.get_Range("U1").get_Value());
        entity.MTTR = EntityConversions.ConvertMTTRStringToInt(Row.get_Range("V1").get_Value());
        entity.RepairedOnTime = Row.get_Range("W1").get_Value().ToString().ToLowerCase() == "no" ? false : true;
        SMEntities.Add(entity);
    }

    return SMEntities;
}

我已经运行了代码分析(我正在使用 Visual Studio 2012 并在 .NET 4.5 中进行开发)并且我有一个 CA1502: Avoid excessive complexity (复制如下)。作为一名初级开发人员(我 17 岁),我尝试使用 MSDN 了解更多相关信息,但是,我对为什么我的圈复杂度为 33 感到有点困惑。

CA1502

Avoid excessive complexity

'Extraction.ExtractSMData(List<Range>)' has a cyclomatic complexity of 33. Rewrite or refactor the method to reduce complexity to 25.

Core.Extraction.cs:104

我可以用我的 quick-ifs(condition ? if_true : if_false,这些叫什么?)看到它可能不好,但我仍然只能看到它为 5。

更新:

圈复杂度现在是 33...

如果我注释掉 entity.IncidentNumber = Row.get_Range("K1").get_Value();复杂度变为 32。我认为 get_Range()get_Value()每个人都有一个,但没关系......

如果我注释掉 entity.RepairedOnTime = Row.get_Range("W1").get_Value().ToString().ToLower() == "no" ? false : true;复杂度变为 28...

get_Range() , get_Value() , quick-if 为 3, do ToString()ToLower()数?

最佳答案

我计算方法本身、foreach 和两个条件运算符的复杂度总共为 4。如果对 get_Range 的 13 次调用中的每一次都值得 +1 复杂度,而对 get_Value 的 13 次调用中每一次都值得 +1 复杂度,那么总复杂度将加起来为 30 (仍然 1 短,但接近)。我不确定为什么这两个函数会增加复杂性,但这似乎是合理的。

尝试删除调用 get_Rangeget_Value 的行之一,看看圈复杂度是否下降到 29。

关于c# - 圈复杂度为 31,这是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13741251/

相关文章:

c# - 匿名类型的属性列表

c# - 为什么 C# 不能推断数据表行的类型

c++ - 为什么此代码在 Visual Studio 2012 的代码分析中发出缓冲区溢出警告 (C6385/C6386)?

c# - Visual Studio 代码分析与 StyleCop + FxCop

c# - 有没有办法使用纯 .NET Framework 生成 DSA 证书,如果没有,为什么?

c# - 无法将源类型转换为目标类型

c# - CA1822 在 Release模式下错误地应用于 [TestMethod] 异步任务方法?

code-analysis - 如何抑制宪兵缺陷?

.net - 非 .Net C++ 代码的 FxCop(或等同物)

interface - FxCop + MVP : "Properties should not be write only"