用于切换Java的McCabe Cyclomatic Complexity

时间:2011-11-28 03:24:01

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

我使用的是带有13种情况的switch语句,每种情况只有一行返回值。

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

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

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;

依旧......

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

我对McCabe工具知之甚少。 Cyclomatic复杂性考虑的一个问题是多个退出点。

我喜欢EnumMap的想法。

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

result = null;

case Types.TIME:
case Types.DATE:
case Types.TIMESTAMP: result = AbstractDataType.TIME

// etc.

return result;

我认为这可以减少圈复杂度,无论人们怎么看待它作为风格。编写语句是一种不同的方式,但是你应该判断它是否更容易。

答案 2 :(得分: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();

封装和可重复使用: - )