本问题已经有最佳答案,请猛点这里访问。

在我目前正在处理的代码库中,通常需要从链的上游传入一个字符串,并将其用作查找不同String的键。当前的标准习惯是使用switch语句,但是对于较大的switch语句(想想~20-30个案例),sonarqube说这是代码气味,应该减少圈复杂度。我目前的解决方案是使用静态HashMap,就像这样

private static final HashMap 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);
}

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

你不能将映射外包到文件中并从那里读取吗?这种方法更有活力。比将100个switch-case语句或map-puts硬编码到程序中更好。除此之外,我认为地图方法更加干净。但我没有看到你需要在这里使用静态块的原因,我不喜欢它们......

blog.sonarsource.com/说"甚至McCabe在他的原始论文中承认,在开关中处理案例陈述似乎并不合适",关于圈复杂性。所以你可以决定忽略它。

@ zero298我觉得使用多态不是解决这个问题的正确方法,因为现在使用switch语句的方式是一个基本的数据结构,而不是一种确定运行方式的方法。

@Kayaman我同意它在很大程度上是一个随意的指标,但管理层正在进行大规模的技术债务推动,而作为一名初级开发人员,许多较小的代码味道的东西会被压缩到堆栈中。我可能会忽略它,但如果有更好的方式,我宁愿这样做。

没有一般更好的方法,这取决于您的实际代码。

@Kayaman这是一个好点。我想我会选择Zabuza所说的并且只使用非静态地图,因为地图不应该在实际设置后进行更改。谢谢大家的帮助。

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

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

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