Цикломатическая сложность, когда я хочу проверить правильные значения аргументов

У меня есть параметр с 3 параметрами, и я хочу, чтобы данные из параметров были правильными, поэтому у меня есть что-то вроде этого:

  • если param1 является нулем, выдает исключение ArgumentNullException
  • если param1.Property < 0, сгенерировать исключение
  • если para1.Property > 100 бросить исключение

  • если param2 - пустое исключение

  • если param2.Property - пустое исключение
  • если param2.Property не> 0, сгенерировать исключение

и так далее.

В этом случае у меня цикломатическая сложность 7, и кажется, что от 6 до 10 трудно поддерживать, поэтому рекомендуется 5 или меньше.

Я думал о создании метода, который проверяет правильность каждого параметра, но если у меня есть 3 параметра и 3 метода, сложность равна 4. Поэтому я могу использовать только один цикл или один, если больше...

Поэтому мой вопрос заключается в том, что я хочу убедиться, что данные, которые я получаю от параметров, верны, и позже, если все правильно, сделайте свою работу, но я не знаю, как я могу проверить свои параметры и реализовать свой код и сохранить сложность ниже 6.

Благодарю.

1 ответ

Решение

Лично, когда я хочу проверить параметры, я точно оцениваю, какие типы проверки требуются (проверка на нуль, минимальные / максимальные значения, диапазон дат и т. Д.). Как только это будет сделано, я создаю методы в статическом служебном классе, принимающие параметры для проверки для возврата значения bool, указывающего на успех.

Вот три метода, которые я использую в моем проекте для проверки:

public static bool NullCheck(params object[] parameters)
{
    foreach (object parameter in parameters)
        if (parameter == null)
            return false;
    return true;
}

public static bool MinCheck(int minimum, params int[] parameters)
{
    foreach (int parameter in parameters)
        if (parameter < minimum)
            return false;
    return true;
}

public static bool MaxCheck(int maximum, params int[] parameters)
{
    foreach (int parameter in parameters)
        if (parameter > maximum)
            return false;
    return true;
}

Его использование заключается в следующем:

if (!NullCheck(obj1, obj2, obj3, obj4)) throw new ArgumentNullException("Invalid params");
else if (!MinCheck(5, int1, int2, int3, int4)) throw new Exception();
else if (!MaxCheck(8, int5, int6, int7, int8)) throw new Exception();



редактировать

Если вызывающая сторона должна знать, какой параметр недопустим, а не возвращать значение bool, она может вернуть Tuple<bool, object[]> где bool указывает на успех / неудачу метода и object[] содержит любые недопустимые объекты.
Пример реализации включен ниже:

public static Tuple<bool, object[]> NullCheck(params object[] parameters)
{
    var failures = new List<object>();
    foreach (object parameter in parameters)        
        if (parameter == null)
            failures.Add(parameter);
    if (failures.Count == 0)
        return new Tuple<bool, object[]>(true, null);
    else
        return new Tuple<bool, object[]>(false, failures.ToArray());
}
Другие вопросы по тегам