Java 降低大型switch语句的复杂性

Java 降低大型switch语句的复杂性,java,data-structures,sonarqube,readability,cyclomatic-complexity,Java,Data Structures,Sonarqube,Readability,Cyclomatic Complexity,在我目前正在研究的代码库中,通常需要从链的更上层传入一个字符串,并将其用作键来查找不同的字符串。当前的标准习惯用法是使用switch语句,但是对于较大的switch语句(考虑20-30种情况),sonarqube说这是一种代码味道,应该减少圈复杂度。我目前的解决方案是使用静态HashMap,如下所示 private static final HashMap<String, String> sortMap; static { sortMap = new HashMap<&

在我目前正在研究的代码库中,通常需要从链的更上层传入一个字符串,并将其用作键来查找不同的字符串。当前的标准习惯用法是使用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);
}
私有静态最终HashMap sortMap;
静止的{
sortMap=newhashmap();
排序映射put(“foo1”、“bar1”);
sortMap.put(“foo2”、“bar2”);
sortMap.put(“foo3”、“bar3”);
等
}
受保护的字符串映射器密钥(字符串密钥){
返回sortMap.get(键);
}

然而,这似乎并没有真正变得更干净,如果有什么事情对维护人员来说更令人困惑的话。有没有更好的办法解决这个问题?还是应该在这种情况下忽略声纳?我知道使用多态性,也就是说,对于这个问题来说,这似乎有些过分,因为switch语句被用作临时数据结构,而不是基本的多态性。我发现的关于减少开关大小写圈复杂度的其他类似问题在本例中并不真正适用。

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

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


您偶然发现了主要需求:可维护性。如果我们用太多的逻辑或太多的数据进行编码,我们就会产生脆弱的代码。选择适合交换信息类型的设计模式,并将功能导出到可维护的位置,以供以后必须进行更改的用户使用。。。因为对于这样一个长列表,很有可能会以某种频率发生更改。

根据您的示例,如果只是从键中选择映射值,则表或属性文件将是更合适的处理方法

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


您偶然发现了主要需求:可维护性。如果我们用太多的逻辑或太多的数据进行编码,我们就会产生脆弱的代码。选择适合交换信息类型的设计模式,并将功能导出到可维护的位置,以供以后必须进行更改的用户使用。。。因为有这么长的列表,很有可能会以某种频率发生更改。

您不能将映射外包到一个文件中并从那里读取吗?这种方法更具活力。比在程序中硬编码100个switch case语句或map put要好。除此之外,我认为map方法要干净得多。但是我不明白为什么需要在这里使用静态块,我不喜欢它们。。。就圈复杂度而言,“甚至连McCabe在他的原始论文中也承认,在转换中对案例陈述的处理似乎不太正确”。所以你可以决定忽略它。@zero298我觉得使用多态性并不是解决这个问题的正确方法,因为现在使用switch语句的方式是作为一种基本的数据结构,而不是一种决定运行什么的方式。@Kayaman我同意这在很大程度上是一种任意的度量,但管理层需要大量的技术债务,作为一名初级开发人员,很多次要的代码气味都被推到了我的面前。我可能会忽略它,但如果有更好的方法,我更愿意这样做。没有更好的方法,这取决于您的实际代码。您不能将映射外包到一个文件中并从那里读取吗?这种方法更具活力。比在程序中硬编码100个switch case语句或map put要好。除此之外,我认为map方法要干净得多。但是我不明白为什么需要在这里使用静态块,我不喜欢它们。。。就圈复杂度而言,“甚至连McCabe在他的原始论文中也承认,在转换中对案例陈述的处理似乎不太正确”。所以你可以决定忽略它。@zero298我觉得使用多态性并不是解决这个问题的正确方法,因为现在使用switch语句的方式是作为一种基本的数据结构,而不是一种决定运行什么的方式。@Kayaman我同意这在很大程度上是一种任意的度量,但管理层需要大量的技术债务,作为一名初级开发人员,很多次要的代码气味都被推到了我的面前。我可能会忽略它,但如果有更好的方法,我更愿意这样做。没有通用的更好的方法,这取决于您的实际代码。