【问题标题】:Reducing complexity of large switch statements [duplicate]降低大型 switch 语句的复杂性
【发布时间】:2017-10-17 20:09:14
【问题描述】:

在我目前正在处理的代码库中,通常必须获取从更上层传入的字符串并将其用作查找不同字符串的键。当前的标准习惯用法是使用 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 语句被用作临时数据结构而不是基本的多态性。我发现的其他关于降低 switch case 圈复杂度的类似问题在这种情况下并不适用。

【问题讨论】:

  • 你不能将映射外包到一个文件中并从那里读入吗?这种方法更具活力。比在程序中硬编码 100 个 switch-case 语句或 map-puts 更好。除此之外,我认为地图方法要干净得多。但我看不出你需要在这里使用 static-blocks 的原因,我不喜欢它们......
  • blog.sonarsource.com/… 说“甚至 McCabe 在他的原始论文中也承认,在 switch 中对 case 语句的处理似乎不太正确”,关于圈复杂度。所以你可以决定忽略它。
  • @zero298 我觉得使用多态不是解决这个问题的正确方法,因为现在使用 switch 语句的方式是一种基本的数据结构,而不是一种确定要做什么的方法运行。
  • @Kayaman 我同意这在很大程度上是一个武断的指标,但管理层正在大力推动技术债务,作为一名初级开发人员,许多更小的代码异味东西被推到堆栈中我。我可能会忽略它,但如果有更好的方法我更愿意这样做。
  • 没有通用更好的方法,这取决于你的实际代码。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多