【问题标题】:McCabe Cyclomatic Complexity for switch in Java用于 Java 中 switch 的 McCabe 循环复杂度
【发布时间】:2011-11-28 03:24:01
【问题描述】:

我用的是一个switch语句,有13个case,每个case只有一行返回值。

McCabe 将其涂成红色。有没有更简单的方法来编写一个大的 switch 语句?读起来似乎并不复杂,但我不喜欢默认设置变成红色。如果其他人在我的代码上使用相同的工具并看到红色的东西,他们可能会认为我很愚蠢:-)

编辑:我将不同的 SQL 类型映射到我自己的更抽象的类型,因此减少了类型的总数。

case Types.TIME:
    return AbstractDataType.TIME;
case Types.TIMESTAMP:
    return AbstractDataType.TIME;
case Types.DATE:
    return AbstractDataType.TIME;
case Types.BIGINT:
    return AbstractDataType.NUMERIC;
case Types.DECIMAL:
    return AbstractDataType.NUMERIC;

等等……

【问题讨论】:

  • 如果你解释一下为什么你在一个 switch 中有 13 个 case 以及为什么你不能使用多态性或 Map 来做同样的事情会更容易。
  • 同意。你能给我们看看代码吗?
  • 您可以改用EnumMap
  • +1 用于地图,虽然它们只会隐藏复杂性(因此该工具不会抱怨),但不会降低复杂性。您的用例更像是一个注册表而不是 if-else 条件,因此地图可能更适合。

标签: java coding-style complexity-theory switch-statement metrics


【解决方案1】:

您正在使用代码来表达真正的数据。只需使用枚举映射或为所有常量字典定义一次。这样,您只是参数化了一个简单而通用的对应算法,而不是编写一个长的 switch 案例。

【讨论】:

    【解决方案2】:

    我对 McCabe 工具了解不多。圈复杂度考虑的事情之一是多个出口点。

    我喜欢 EnumMap 的想法。

    如果要使用开关,您可以有一个结果变量并取消所有返回语句。您还可以折叠所有具有相同结果类型的源值:

    result = null;
    
    case Types.TIME:
    case Types.DATE:
    case Types.TIMESTAMP: result = AbstractDataType.TIME
    
    // etc.
    
    return result;
    

    我认为这会降低圈复杂度,无论人们如何看待它作为风格。并且是另一种写法,但是否更容易判断。

    【讨论】:

      【解决方案3】:

      +1 地图创意...

      类似这样的:

      初始化地图

      Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>();
      map.put(Types.TIME, AbstractDataTypes.TIME);
      // and so on
      

      然后在你的代码中简单地做

      return map.get(sqlTimeType);
      

      然而,更好的解决方案是将此映射包含在枚举本身中,这样您就可以假设您无法控制 Sql 枚举类型...

      AbstractDataTypes.fromSqlType(timeType);
      

      如果你这样做:

      sqlTimeType.getAbstractType();
      

      封装和可重复使用:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多