Java中交换机的McCabe圈复杂度



我使用一个有13个case的switch语句,每个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;

您正在使用代码来表达真正的数据。只需使用枚举映射或一次性定义常量字典。这样,您只需参数化一个简单而通用的通信算法,而不必编写冗长的切换案例。

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

我喜欢EnumMap这个主意。

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

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

我认为这降低了圈复杂度,不管别人怎么看待它的风格。这是写语句的另一种方式,不过你应该判断它是否更容易。

+1 for the Map idea…

像这样:

初始化map

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();

封装和可重用:-)

最新更新