9

Estoy usando una declaración de interruptor con 13 casos, cada caso solo tiene un valor de retorno de una línea.McCabe Cyclomatic Complejidad para el interruptor en Java

McCabe pinta esto en rojo. ¿Hay alguna manera más fácil de escribir una declaración de cambio grande? No parece complejo de leer, pero no me gusta que la configuración predeterminada se vuelva roja. Si otras personas usan la misma herramienta en mi código y ven cosas rojas, pueden pensar que soy estúpido :-)

Editar: Estoy mapeando diferentes tipos de SQL a mis propios tipos más abstractos, por lo tanto, reduciendo la cantidad total de tipos.

case Types.TIME: 
    return AbstractDataType.TIME; 
case Types.TIMESTAMP: 
    return AbstractDataType.TIME; 
case Types.DATE: 
    return AbstractDataType.TIME; 
case Types.BIGINT: 
    return AbstractDataType.NUMERIC; 
case Types.DECIMAL: 
    return AbstractDataType.NUMERIC; 

y así sucesivamente ...

+4

Es más fácil si se le explica por qué tiene 13 casos en un cambio y por qué no podría hacer lo mismo usando un polimorfismo o un Mapa. –

+0

de acuerdo. ¿Puedes mostrarnos el código? – Kane

+0

Gracias, vea la edición. –

Respuesta

6

no sé mucho acerca de las herramientas de McCabe. Una de las cosas que la complejidad de Cyclomatic considera son los puntos de salida múltiples.

Me gusta la idea de EnumMap.

Si se va a usar un conmutador, podría tener una variable de resultado y eliminar todas las declaraciones de devolución. También puede contraer todos los valores de origen que tienen el mismo tipo de resultado:

result = null; 

case Types.TIME: 
case Types.DATE: 
case Types.TIMESTAMP: result = AbstractDataType.TIME 

// etc. 

return result; 

Creo que esto reduce la complejidad ciclomática, independientemente de lo que piensen de él como de estilo. Y es una manera diferente de escribir la declaración, aunque si es más fácil, debe juzgar.

7

Está utilizando un código para expresar lo que realmente son los datos. Simplemente use un mapa enum o defina una vez para todos un Diccionario constante. De esta forma, solo está parametrizando un algoritmo de correspondencia simple y genérico, en lugar de escribir un caso de interruptor largo.

3

1 de la idea mapa ...

Algo como esto:

inicializar el mapa

Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>(); 
map.put(Types.TIME, AbstractDataTypes.TIME); 
// and so on 

Luego, en el código sencillo hacer

return map.get(sqlTimeType); 

Un incluso Sin embargo, una mejor solución sería incluir este mapeo en la enumeración en sí para que pueda hacer una ssuming usted no tiene control sobre los tipos de enumeración Sql ...

AbstractDataTypes.fromSqlType(timeType); 

y si lo hace:

sqlTimeType.getAbstractType(); 

encapsulado y reutilizable :-)

Cuestiones relacionadas