当我想检查参数的正确值时,Cyclomatic Complexity

时间:2017-03-17 16:04:58

标签: c# parameters cyclomatic-complexity

我有一个带3个参数的参数,我想确保参数中的数据是正确的,所以我有类似的东西:

  • 如果param1为null抛出异常ArgumentNullException
  • 如果param1.Property< 0抛出异常
  • 如果para1.Property> 100抛出异常

  • 如果param2为空抛出异常

  • 如果param2.Property为null throw exception
  • 如果param2.Property不是> 0抛出异常

等等。

在这种情况下,我的圈复杂度为7,似乎在6到10之间很难维护,所以推荐5或更少。

我正在考虑创建一个检查每个参数是否正确的方法,但是如果我有3个参数和3个methdos,则复杂度为4.所以我只能使用一个循环,或者如果更多则使用一个循环......

所以我的问题是,我想确保我从参数中收到的数据是正确的,以后如果一切正确,就可以完成工作,但我不知道如何检查我的参数并实现我的代码并将复杂性保持在6以下。

感谢。

1 个答案:

答案 0 :(得分:2)

就个人而言,每当我想验证参数时,我都会准确评估需要哪些类型的验证(空检查,最小/最大值,日期范围等)。完成此操作后,我在静态实用程序类中创建方法,接受验证参数以返回指示成功的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());
}