2012-10-09 26 views
6

Mi chiedo come ridurre la complessità ciclomatica del seguente codice e se questo è qualcosa che dovrei preoccuparmi.Come ridurre la "complessità ciclica" del seguente codice

prega di fare riferimento al metodo ValuePojo.getSomething() (Si prega di non preoccuparti per la nomina variabile, questo è stato riscritto per chiarezza in questa domanda)

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

Qual è la complessità ciclomatica riportata? – Vikdor

+0

11 Penso, abbastanza alto da far scattare la condizione in Sonar ma non a un livello folle. –

+2

È possibile inserire la logica nell'enumerazione. –

risposta

5

La complessità ciclomatica è determinato dal numero di rami di esecuzione nel tuo codice. if - else blocchi, switch dichiarazioni: tutti aumentano la complessità ciclomatica del codice e aumentano anche il numero di casi di test necessari per garantire una copertura del codice appropriata.

per ridurre la complessità nel codice, vorrei suggerire di rimuovere le case dichiarazioni che non hanno un comportamento definito e sostituirlo con un default comportamento nel vostro switch dichiarazione.

Ecco un altro question su Stack Overflow che risolve questo problema.

+0

Grazie per la risposta, ho dato un'occhiata a quel thread e non sono riuscito a trovare una "soluzione" che affrontasse adeguatamente il mio problema. Inoltre non ero sicuro che ci fosse un problema. –

+1

Penso che la complessità ciclomatica sia una misura abbastanza soggettiva. Non devi preoccuparti di cambiare il codice finché è leggibile e fa il lavoro. Un'elevata complessità ciclomatica può indicare problemi nel modello a oggetti, ma non penso che questo sia rilevante per il tuo esempio. – Luhar

+0

Ok. Grazie per lo sforzo che hai messo in questa risposta –

8

Se è davvero necessario ridurre la complessità ciclomatica, è possibile considerare l'utilizzo di una mappa. Ovviamente, nella tua implementazione, dovrebbe essere creato e inizializzato solo una volta.

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

Soluzione curiosa, grazie per l'idea. Sfortunatamente nel mio caso i valori possono cambiare, quindi la mappa dovrebbe essere rifatta in ogni momento. –

+0

Se si aggiusta il valore1 ... 3 per usare getter e setter (che probabilmente dovresti fare comunque), non è un problema. –

+15

Questo non riduce veramente la complessità del programma, ma lo nasconde semplicemente dall'analizzatore di codici spostando la logica da una casella di commutazione a una mappa. – satellite779

Problemi correlati