c# - 当我想检查参数的正确值时的圈复杂度

标签 c# parameters cyclomatic-complexity

我有一个包含 3 个参数的参数,我想确保来自参数的数据是正确的,所以我有类似的东西:

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

  • 如果param2为空抛出异常

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

等等。

在本例中我的圈复杂度为7,看起来6到10之间很难维护,所以建议5或更少。

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

所以我的问题是,我想确保我从参数接收到的数据是正确的,如果一切正确,则执行该工作,但我不知道如何检查我的参数并实现我的代码并将复杂度保持在 6 以下。

谢谢。

最佳答案

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

关于c# - 当我想检查参数的正确值时的圈复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42862195/

相关文章:

java - 具有许多参数的枚举

javascript - 修复循环内 if/else 的圈复杂度

php - 减少圈复杂度的过多 switch case 的替代方案?

c# - 在 javascript 中执行 split() 并忽略空白条目的最佳方法是什么?

c# - 单选按钮外观

c# - 使用 LINQ 转换为 Int

java - 参数的变量作为参数

php - 如何使用哈希提取 URL 参数?

sonarqube - "complexity"指标和 "complexity/method"指标之间的差异

c# - 我如何使用 Fluent NHibernate 来区分父关系的列