Каков наилучший способ уменьшить цикломатическую сложность при проверке данных?[закрыто]

StackOverflow https://stackoverflow.com/questions/204742

Вопрос

Прямо сейчас я работаю над веб-приложением, которое получает значительный объем данных из базы данных, которая потенциально может возвращать нулевые результаты.При переходе к цикломатической сложности приложения вес ряда функций колеблется от 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, позволили бы ему пройти в соответствии с этим обоснованием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top