Creo que hay muchos escollos en el Ejemplo 2, que en el futuro podría conducir a un código no deseado. Primero, el enfoque aquí se basa en la lógica que rodea la variable 'myString'. Por lo tanto, para ser explícitos, todas las pruebas de las condiciones deben ocurrir en un bloque de código que tenga en cuenta la lógica conocida y por defecto / desconocida .
¿Qué pasaría si posteriormente se introdujera un código involuntariamente en el ejemplo 2 que alteró significativamente la salida?
if (myString == null)
{
return false;
}
//add some v1 update code here...
myString = "And the winner is: ";
//add some v2 update code here...
//buried in v2 updates the following line was added
myString = null;
//add some v3 update code here...
//Well technically this should not be hit because myString = null
//but we already passed that logic
myString = "Name " + myString;
// Do something more here...
return true;
Creo que con el bloque else
inmediatamente después de la comprobación de un nulo, los programadores que agregaron las mejoras a las futuras versiones agregarán toda la lógica juntos porque ahora tenemos una cadena de lógica que no fue intencional para la regla original (devolviendo si el valor es nulo).
Confío en esto fuertemente a algunas de las líneas de guía de C # en Codeplex (enlace a eso aquí: enlace ) que indican el siguiente:
"Agregue un comentario descriptivo si se supone que el bloque predeterminado (de lo contrario) está vacío. Además, si se supone que no se puede alcanzar ese bloque, lance una InvalidOperationException para detectar futuros cambios que puedan caer en los casos existentes. Esto garantiza un mejor código, porque se han pensado en todas las rutas por las que puede viajar el código. "
Creo que es una buena práctica de programación cuando se usan bloques lógicos como este para tener siempre un bloque predeterminado agregado (if-else, caso: predeterminado) para tener en cuenta todas las rutas de código explícitamente y no dejar el código abierto a consecuencias lógicas no deseadas.