降低大型 switch 语句的复杂性

Reducing complexity of large switch statements

在我目前正在处理的代码库中,通常必须采用从链的更上游传入的字符串并将其用作查找不同字符串的键。当前的标准习惯用法是使用 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);
}

然而,这似乎并没有真正变得更干净,而且对于维护者来说似乎更令人困惑。有没有更好的方法来解决这个问题?或者在这种情况下应该忽略sonarqube吗?我知道使用多态性,即 Ways to eliminate switch in code,但是对于这个问题来说这似乎有点矫枉过正,因为 switch 语句被用作临时数据结构而不是基本的多态性。我发现的关于减少 switch case 圈复杂度的其他类似问题在这种情况下并不适用。

如果按照您的示例,这只是从键中选择映射值的情况,table 或属性文件将是更合适的处理方式。

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

您遇到了主要需求:可维护性。如果我们在编码中加入了太多逻辑或太多数据,我们就会编写出脆弱的代码。选择适合交换信息类型的设计模式,并将功能导出到一个可维护的地方,供以后必须进行更改的人使用……因为像这样的长列表,很可能会以某种频率发生更改。