【问题标题】:Refactor multiple Else-if in Sonar Qube在 Sonarqube 中重构多个 Else-if
【发布时间】:2020-04-26 07:52:27
【问题描述】:

下面的代码我有多个 else if 条件。因此,当我使用声纳立方体运行代码时,它会说“重构此方法以将其认知复杂度从 31 降低到允许的 15。”有人可以帮我将认知复杂度从 31 降低到 15。

private final String method1(){

            if(!StringUtils.isEmpty(stringvariable)){
                if(stringvariable.equals("str1") || stringvariable.equals("str2") || stringvariable.equals("str3") ){
                    Stringvariable1 = "val1";
                }
                else if(stringvariable.equals("str4") || stringvariable.equals("str5") ){
                    Stringvariable1 = "val2";
                }
                else if(stringvariable.equals("str6") || stringvariable.equals("str7") || stringvariable.equals("str8")){
                    Stringvariable1 = "val3";
                }
                else if(stringvariable.equals("str9") || stringvariable.equals("str10") || stringvariable.equals("str11")){
                    Stringvariable1 = "val4";
                }
                else if(stringvariable.equals("str12") || stringvariable.equals("str13") || stringvariable.equals("str14")){
                    Stringvariable1 = "val5";
                }
                else if(stringvariable.equals("str15")){
                    Stringvariable1 = "val6";
                }
                else if(stringvariable.equals("str16") || stringvariable.equals("str17") || stringvariable.equals("str18") || stringvariable.equals("str19")){
                    Stringvariable1 = "val7";
                }
                else if(stringvariable.equals("str20") || stringvariable.equals("str21") ||stringvariable.equals("str22")){
                    Stringvariable1 = "val8";
                }
                else if(stringvariable.equals("str23") || stringvariable.equals("str24") || stringvariable.equals("str25") || stringvariable.equals("str26")){
                    Stringvariable1 = "val9";
                }
                else if(stringvariable.equals("str27") || stringvariable.equals("str28")){
                    Stringvariable1 = "val10";
                }
                else if(stringvariable.equals("str29") || stringvariable.equals("str30")){
                    Stringvariable1 = "val11";
                }
                else if(stringvariable.equals("str31")){
                    Stringvariable1 = "val12";
                }
                else if(stringvariable.equals("str32")){
                    Stringvariable1 = "val13";
                }
                else if(stringvariable.equals("str33") || stringvariable.equals("str34") || stringvariable.equals("str35") || stringvariable.equals("str36")){
                    Stringvariable1 = "val14";
                }
                else if(stringvariable.equals("str37")){
                    Stringvariable1 = "val15";
                }
                else if(StringUtils.isEmpty(stringvariable) ){
                    Stringvariable1 = "val16";
                }
                else {
                    Stringvariable1 = "val17";
                }
            }
            else{
                Stringvariable1 = "val18";
            }

        return Stringvariable1;
    }

【问题讨论】:

  • 尝试使用 Switch 语句

标签: java sonarqube-scan


【解决方案1】:

如果您想在每个案例中匹配多组字符串,您最好使用某种映射函数,该函数具有匹配值的Set<String>,然后是关联的结果。

Map<Set<String>, String> mappedOutcomes = new HashMap<>();
Set<String> matches = new HashSet<String>();
matches.add("match1");
mathces.add("match2);
mappedOutcomes.add(mySet, "str1");

String stringVariable = "somequery";
for(Map.Entry<Set, String> entry in mappedOutcomes.entrySet()){
  // Bear in mind case-sensitivity here for hashset, you may want to convert all strings to lower/upper case
  if(entry.getKey().contains(stringVariable)){
    return entry.getValue();
  }
}

// Else if you get here, no match was found

您可以更进一步,编写一个自定义包装类,其中包含您的匹配项和结果集,然后只存储您的对象的列表。这比遍历 Map 的入口集要好。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多