我使用一个有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();
封装和可重用:-)