Durante una revisión reciente del código, se me pidió que pusiera default
casos en todos los archivos dondequiera switch
que se use el bloque, incluso si no hay nada que hacer default
. Eso significa que tengo que poner el default
caso y no escribir nada en él.
¿Es esto lo correcto? ¿Qué propósito tendría?
Respuestas:
Parece que hay tres casos cuando una
default
declaración no es necesaria:no quedan otros casos, porque hay un conjunto limitado de valores que ingresan al
switch case
. Pero esto podría cambiar con el tiempo (intencionalmente o accidentalmente), y sería bueno tener un cambiodefault case
si algo cambia _ podría registrar o advertir al usuario sobre un valor incorrecto.usted sabe cómo y dónde
switch case
se usará y qué valores ingresarán. De nuevo, esto podría cambiar y podría ser necesario un procesamiento adicional.otros casos no necesitan ningún procesamiento especial. Si este es el caso, creo que se le pide que agregue un
default case
, porque es un estilo de codificación aceptado y hace que su código sea más legible.Los dos primeros casos se basan en suposiciones. Entonces (suponiendo que trabaje en un equipo no tan pequeño ya que tiene revisiones de código regulares), no puede permitirse hacer esas suposiciones. No sabe quién estará trabajando con su código o haciendo llamadas a funciones / invocando métodos en su código. Del mismo modo, es posible que deba trabajar con el código de otra persona. Tener el mismo estilo de codificación facilitará el manejo del código de alguien (incluido el suyo).
fuente
throw new IllegalStateException("Unrecognised case "+myEnum)
que le muestra dónde y cuál es el error.else
cláusula después de cada,if/else if
incluso si sabe que eso no debería suceder? No me parece una buena idea ...No es raro que los estándares de codificación de la empresa requieran un caso predeterminado para todas las
switch
declaraciones. Una razón para ello es que facilita a los lectores encontrar el final de laswitch
. Otra razón, probablemente mejor, es que te hace pensar por un segundo sobre lo que debe hacer tu código cuando la condición no coincide con tus expectativas. Independientemente de la razón del requisito, si es un estándar de la compañía, debe seguirlo a menos que haya una razón hermética para no hacerlo.Si cree que
switch
incluye casos para cada condición posible, entonces una buena cosa es hacer unaassert
declaración en el caso predeterminado. De esa manera, cuando alguien cambia el código y, sin darse cuenta, agrega una condición queswitch
no cubre, tocará el botónassert
y se dará cuenta de que necesita abordar esa parte del código.Si
switch
solo cubre algunas de las condiciones posibles, pero no hay que hacer nada especial para las demás, puede dejar el caso predeterminado vacío. Es una buena idea agregar un comentario en ese caso para indicar que el caso predeterminado está vacío intencionalmente porque las condiciones que lo afectan no necesitan ningún trabajo.fuente
assert
?Si "activa" el tipo de enumeración pura, es peligroso tener una reserva predeterminada. Cuando luego agregue valores al tipo de enumeración, el compilador resaltará los interruptores con nuevos valores no cubiertos. Si tiene una cláusula predeterminada allí, el compilador permanecerá en silencio y es posible que se lo pierda.
fuente
En muchos aspectos, esta pregunta es la misma que la pregunta frecuente ¿Necesito una
else
cláusula al final de unif
/else if
ladder que cubra todas las opciones ?La respuesta es, sintácticamente hablando, no, no lo haces. Pero hay un sin embargo ...
Una
default
cláusula puede estar allí por (al menos) dos razones:otherwise
desde un caso. No hay ninguna razón para no incluirlos en el código fuente.Mi filosofía siempre es bastante simple: evaluar el peor de los casos de las dos opciones y elegir el más seguro. En el caso de una cláusula
else
o unadefault
cláusula vacía , las peores opciones son:¿Sobredramático? Tal vez ... pero mi software tiene el potencial de matar gente si sale mal. Prefiero no correr ese riesgo.
Además, las pautas de MISRA-C {ver perfil para afiliación} recomiendan una
default
cláusula para cadaswitch
fuente
else
después de unif
. Pero como dijiste, no, no lo es.Java no lo obliga a tener una declaración 'predeterminada', pero es una buena práctica tenerla todo el tiempo, incluso si el código nunca se puede alcanzar (en este momento). Aquí hay algunas razones:
Al tener una cláusula predeterminada inalcanzable, le muestra al lector de su código que consideró los valores y sabe lo que está haciendo. También permite futuros cambios, por ejemplo: si se agrega un nuevo valor de enumeración, el interruptor no debe ignorar silenciosamente el nuevo valor; puedes lanzar una Excepción allí o hacer otra cosa.
Para atrapar un valor inesperado (en caso de que no esté activando una enumeración) que se pasa, puede ser mayor o menor de lo que esperaba, por ejemplo.
Para manejar acciones 'predeterminadas', donde los interruptores son para un comportamiento especial. Por ejemplo, una variable puede declararse fuera del conmutador pero no inicializarse y cada caso la inicializa en algo diferente. El valor predeterminado en este caso podría inicializarlo a un valor predeterminado para que el código inmediatamente después del cambio no produzca un error / arroje una excepción.
Incluso si decide no poner nada en el valor predeterminado (sin excepciones, registros, etc.), incluso un comentario para decir que ha considerado que el hecho de que nunca ocurrirá un valor predeterminado puede ayudar a la legibilidad de su código; Pero eso se reduce a la preferencia personal.
fuente
También agregaría que depende de la filosofía del lenguaje que esté utilizando. En Erlang, por ejemplo, donde es un enfoque común para "dejar que se bloquee", no definiría un caso predeterminado, pero dejaría que su
case
declaración generara un error si se produce una situación que no fue atendida.fuente
Siempre debe tener un valor predeterminado a menos que haya cubierto de manera comprobable y permanente todos los casos. No cuesta nada y es un seguro contra el incumplimiento de mantener su declaración de cambio en un programa en evolución.
Si está realmente seguro de que no le importan otros casos, el valor predeterminado: break; // no me importa, pero el valor predeterminado predeterminado debería ser algo así como predeterminado: arrojar un nuevo error ("valor inesperado");
Del mismo modo, nunca debe "omitir" una construcción de caso no trivial sin agregar un comentario al efecto que desea omitir. Java se equivocó en la etapa de diseño.
fuente
Considerar
y
Yo diría que esto es superior a tener un caso MALE, un caso FEMENINO y un caso predeterminado que arroja una excepción.
Durante la fase de prueba, la computadora verificará si g es FEMENINO. Durante la producción, se omitirá el cheque. (Sí, una microoptimización!)
Más importante aún, mantendrá su objetivo de 100% de cobertura de código. Si escribiste un caso predeterminado que arroja una excepción, ¿cómo lo probarías?
fuente
Gender . FEMALE . equals ( FEMALE ) ;
evalúa afalse
?Gender.FEMALE.equals (g)
Querías decir, pero como puedes confiar en que las referencias a las enumeraciones sean estables, solo puedes escribirg == Gender.FEMALE
. 4. (Opinión personal) dicho código es mucho más difícil de leer y producirá errores un poco más confusos.