2012-10-09 30 views
6

Me pregunto cómo reducir la Complejidad Ciclomática del siguiente código y si esto es algo que incluso me preocupa.¿Cómo puedo reducir la "complejidad ciclomática" del siguiente código

Por favor refiérase a la ValuePojo.getSomething método() (Por favor, no se preocupe por la variable de nombres, esto se ha reescrito para mayor claridad en esta cuestión)

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

¿Cuál es la complejidad informado ciclomática? – Vikdor

+0

11 Creo que, lo suficientemente alto como para activar la condición en Sonar, pero no a un nivel loco. –

+2

Puede insertar la lógica en la enumeración. –

Respuesta

5

La complejidad ciclomática se determina por el número de ramas de ejecución en su código. if - else bloques, declaraciones switch - todos aumentan la complejidad de Cyclomatic de su código y también aumentan el número de casos de prueba que necesitaría para garantizar una cobertura de código adecuada.

Para reducir la complejidad de su código, le sugiero que elimine las declaraciones case que no tienen un comportamiento definido y lo reemplace con un comportamiento default en su declaración switch.

Aquí hay otro question en desbordamientos de pila que resuelve este problema.

+0

Gracias por la respuesta, miré ese hilo y no pude encontrar una "solución" que abordara adecuadamente mi problema. Tampoco estaba seguro de que hubiera un problema. –

+1

Creo que la complejidad ciclomática es una medida bastante subjetiva. No necesita preocuparse por cambiar su código, siempre que sea legible y haga el trabajo. Una alta complejidad ciclomática puede señalar problemas en su modelo de objeto, pero no creo que esto sea relevante para su ejemplo. – Luhar

+0

Ok. Gracias por el esfuerzo que pones en esta respuesta –

8

Si realmente necesita reducir la complejidad ciclomática, puede considerar el uso de un Mapa. Obviamente, en su implementación, solo debe crearse e inicializarse una vez.

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

Solución curiosa, gracias por la idea. Lamentablemente, en mi caso, los valores pueden cambiar, por lo que el mapa debería volver a reproducirse todo el tiempo. –

+0

Si refactoriza value1 ... 3 para usar getters y setters (que probablemente debería hacer de todos modos), eso no es un problema. –

+15

Esto realmente no está reduciendo la complejidad del programa, simplemente ocultándolo del analizador de código moviendo la lógica del conmutador a un mapa. – satellite779

Cuestiones relacionadas