Я разрабатываю приложение, которое извлекает данные из файла 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
Избегайте чрезмерной сложности
'Extraction.ExtractSMData(List<Range>)'
имеет цикломатическую сложность 33. Перепишите или реорганизуйте метод, чтобы уменьшить сложность до 25.
Core.Extraction.cs:104
Я вижу с моими быстрыми если (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()
, быстро, если 3, считать ли ToString()
и ToLower()
?
conditional operator
. Это тернарный оператор, а не тернарный оператор. Хотя это единственный тернарный оператор в языке. :) - person Sani Singh Huttunen   schedule 06.12.2012bool x = Row.get_Range("W1").get_Value().ToString().ToLowerCase() == "no" ? false : true;
можно заменить наbool x = Row.get_Range("W1").get_Value().ToString().ToLowerCase() != "no"
, что не является обязательным оператором, поэтому вы можете немного уменьшить сложность. - person petro.sidlovskyy   schedule 06.12.2012