我使用的是带有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;
依旧......
答案 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();
封装和可重复使用: - )