-1

Below code that i have has multiple else if conditions. Due to this when i run code using sonar cube it is saying "Refactor this method to reduce its Cognitive Complexity from 31 to the 15 allowed." Can Some one help me to reduce cognitive complexity from 31 to 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;
    }
nik898
  • 15
  • 4

1 Answers1

0

Given you want to match multiple sets of strings per case, you'd probably be better off using some kind of mapping function that has a Set<String> of matching values, and then the associated outcome.

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

You could go one step further and write a custom wrapper class containing your set of matches and the outcome, and then just store a List of whatever your object is. This would be better than iterating over a Map's entry set.

Adam
  • 1,724
  • 13
  • 16