我正在开发一个从 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_Range
和 get_Value
的行之一,看看圈复杂度是否下降到 29。
关于c# - 圈复杂度为 31,这是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13741251/