Каков наилучший способ уменьшить цикломатическую сложность при проверке данных?[закрыто]
-
03-07-2019 - |
Вопрос
Прямо сейчас я работаю над веб-приложением, которое получает значительный объем данных из базы данных, которая потенциально может возвращать нулевые результаты.При переходе к цикломатической сложности приложения вес ряда функций колеблется от 10 до 30.По большей части большинство функций с большими номерами содержат много строк, похожих на следующие:
If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)
Что подводит меня к моему вопросу: каков наилучший способ попытаться снизить эти цифры?Прямо сейчас я рассматриваю возможность использования большинства функций ниже 10.
Решение
Как насчет использования Методы расширения.
Imports System.Runtime.CompilerServices
Module Extensions
<Extension()> _
Public Function TryGetString(ByVal row As IDataRecord, i As Integer) As String
If row.IsDBNull(i) Then
Return null
End If
Return row.GetString(i);
End Function
End Module
Тогда вы можете просто написать:
row("Field") = oraData.TryGetString(4)
Это обеспечивает плавное считывание и уменьшает цикломатическую сложность ваших функций.
Другие советы
Разложить на функции, возможно, что-то вроде этого:
//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
if oraData.IsDBNull( fldIndex ) then
row( fldName ) := oraData.GetString(fldIndex);
end;
Конечно, вы можете расширить сигнатуру процедур, чтобы "oraData" и "row" могли передаваться в качестве параметров.
Первый вопрос заключается в следующем:Почему ты "зациклился" на CC?Это инструмент для оценки того, насколько плотен код, и эмпирическое правило должно быть "не слишком большим по сравнению с номером cc".
Вероятно, он затрагивает все эти "ЕСЛИ" и выводит это число - поэтому уменьшите количество "если", вызвав функцию переноса, которая извлекает данные из результирующего набора, который обрабатывает значение null, или измените запрос, чтобы он не возвращал значения null.
Имейте в виду, что нули действительно предоставляют информацию и не являются бесполезными.Например , республиканец или демократ ?использование null не говорит ни о каком выборе.
Ты видел этот вопрос?Он спрашивает что-то подобное (но я думаю, на более базовом уровне)...но тогда это означает, что ответы там могут не сильно помочь здесь.
Я бы определенно согласился с другими приведенными здесь предложениями:если есть повторяющиеся инструкции, которые могут быть аккуратно упакованы в функции / процедуры, это может быть одним из возможных подходов, если вы не просто перемещаете CC.Я не уверен, что вы слишком много выиграли, перейдя от одной процедуры с CC 35 к трем процедурам с CCS 15, 10 и 10.(Это неплохой первый шаг, но в идеале вы могли бы упростить что-то в большем масштабе, чтобы уменьшить общий объем CC в этой области вашей системы.)
Можно провести рефакторинг если в отдельную служебную функцию для уменьшения вашего CC.Для обработки различных типов баз данных (string, int и т.д.) Может потребоваться ряд функций или функция, основанная на различии типов.)
Однако я бы сказал, что любое решение приведет к менее сопровождаемому или читаемому коду (т.е.вы могли бы ухудшить другие показатели!) и, как QA, позволили бы ему пройти в соответствии с этим обоснованием.