Цикломатическая сложность, когда я хочу проверить правильные значения аргументов
У меня есть параметр с 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());
}