2012-10-09 7 views
6

Ich frage mich, wie man die Cyclomatic Complexity des folgenden Codes reduzieren kann und ob das überhaupt etwas ist, um das ich mir Sorgen machen sollte.Wie reduziere ich die "Cyclomatic Complexity" des folgenden Codes

Bitte beachten Sie die Methode ValuePojo.getSomething() (Bitte nicht über die Variablennamen Sorge, hat dies aus Gründen der Klarheit neu geschrieben worden, in dieser Frage)

public class ValuePojo 
{ 
    private ValueTypeEnum type; 

    private BigDecimal value1; 

    private BigDecimal value2; 

    private BigDecimal value3; 

    public ValuePojo() 
    { 
     super(); 
    } 

    /** 
    * This method reports as "HIGH Cyclomatic Complexity" 
    * 
    * @return 
    */ 
    public BigDecimal getSomething() 
    { 
     if (this.type == null) 
     { 
      return null; 
     } 

     switch (this.type) 
     { 
      case TYPE_A: 
      case TYPE_B: 
      case TYPE_C: 
      case TYPE_D: 
       return this.value1; 

      case TYPE_E: 
      case TYPE_F: 
      case TYPE_G: 
      case TYPE_H: 
       return this.value2; 

      case TYPE_I: 
      case TYPE_J: 
       return this.value3; 
     } 

     return null; 
    } 
} 
+0

Was ist die berichtete zyklomatische Komplexität? – Vikdor

+0

11 Ich denke, gerade hoch genug, um den Zustand in Sonar auszulösen, aber nicht auf ein verrücktes Level. –

+2

Sie könnten die Logik in die enum schieben. –

Antwort

5

Die zyklomatische Komplexität bestimmt wird durch die Anzahl der Ausführungszweige in Ihrem Code. if - else Blöcke, switch Anweisungen - alle erhöhen die Cyclomatic-Komplexität Ihres Codes und erhöhen auch die Anzahl der Testfälle, die Sie benötigen, um eine angemessene Codeabdeckung sicherzustellen.

Um die Komplexität in Ihrem Code zu reduzieren, würde ich Ihnen die case Aussagen deutet darauf hin, entfernen Sie das in Ihrer switch Anweisung mit einem default Verhalten nicht ein definiertes Verhalten hat und ersetzen.

Hier ist eine weitere question auf Stack Overflows, die dieses Problem anspricht.

+0

Danke für die Antwort, ich habe mir diesen Thread angeschaut und konnte keine "Lösung" finden, die mein Problem angemessen anspricht. Ich war mir auch nicht sicher, dass es ein Problem gab. –

+1

Ich denke, zyklomatische Komplexität ist ein ziemlich subjektives Maß. Sie müssen sich keine Gedanken darüber machen, Ihren Code zu ändern, solange er lesbar ist und den Job erledigt. Eine hohe zyklomatische Komplexität kann auf Probleme in Ihrem Objektmodell hinweisen, aber ich denke nicht, dass dies für Ihr Beispiel relevant ist. – Luhar

+0

Ok. Danke für die Mühe, die Sie in diese Antwort stecken –

8

Wenn Sie wirklich die zyklomatische Komplexität verringern müssen, können Sie eine Karte verwenden. Offensichtlich sollte es in Ihrer Implementierung nur einmal erstellt und initialisiert werden.

public BigDecimal getSomething() { 
     if (this.type == null) { 
      return null; 
     } 
     Map<Type,BigDecimal> map = new HashMap<Type,BigDecimal>(); 
     map.put(TYPE_A, value1); 
     map.put(TYPE_B, value1); 
     map.put(TYPE_C, value1); 
     map.put(TYPE_D, value1); 
     map.put(TYPE_E, value2); 
     map.put(TYPE_F, value2); 
     map.put(TYPE_G, value2); 
     map.put(TYPE_H, value2); 
     map.put(TYPE_I, value3); 
     map.put(TYPE_J, value3); 

     return map.get(type); 
    } 
+0

Neugierige Lösung, danke für die Idee. Leider können sich die Werte in meinem Fall ändern, so dass die Karte ständig neu erstellt werden müsste. –

+0

Wenn Sie Wert1 ... 3 umwandeln, um Getter und Setter zu verwenden (was Sie wahrscheinlich sowieso tun sollten), ist das kein Problem. –

+15

Dies reduziert nicht wirklich die Komplexität des Programms, sondern versteckt es nur vor dem Code-Analyzer, indem es die Logik von einem Switch-Case in eine Map verschiebt. – satellite779

Verwandte Themen