降低大型switch语句的复杂性

时间:2017-10-17 20:09:15

标签: java data-structures sonarqube readability cyclomatic-complexity

在我目前正在开发的代码库中,必须从链的上游传入一个字符串并将其用作查找不同字符串的键。当前的标准习惯是使用switch语句,但是对于较大的switch语句(想想~20-30个案例),sonarqube说这是代码气味,应该减少圈数复杂性。我目前的解决方案是使用静态HashMap,如此

private static final HashMap<String, String> sortMap;
static {
    sortMap = new HashMap<>();
    sortMap.put("foo1", "bar1");
    sortMap.put("foo2", "bar2");
    sortMap.put("foo3", "bar3");
    etc...
}

protected String mapSortKey(String key) {

    return sortMap.get(key);
}

然而,这似乎并不是什么更清洁,如果有任何事情似乎让维护者更加困惑。有没有更好的方法来解决这个问题?或者在这种情况下应该忽略声纳?我知道使用多态,即Ways to eliminate switch in code,但是这似乎对这个问题来说太过分了,因为switch语句被用作临时数据结构而不是基本的多态。我在减少开关盒环形复杂性方面发现的其他类似问题在这种情况下并不适用。

1 个答案:

答案 0 :(得分:0)

通过您的示例,如果只是从键中选择映射值的情况,表或属性文件将是处理此问题的更合适的方法。

如果您在不同的switch语句中讨论逻辑,您可能会发现规则引擎更适合。

您满足了主要要求:可维护性。如果我们编写太多逻辑或太多数据,我们就会编写脆弱的代码。选择适合切换信息类型的设计模式,并将功能导出到可维护的地方,以便以后必须进行更改...因为有这样的长列表,很可能会发生一些频率的变化。