Creo que hay muchas trampas en el Ejemplo 2, que en el futuro podrían conducir a un código no deseado. Primero, el foco aquí se basa en la lógica que rodea la variable 'myString'. Por lo tanto, para ser explícito, todas las pruebas de condiciones deben realizarse en un bloque de código que tenga en cuenta la lógica conocida y la predeterminada / desconocida .
¿Qué pasa si más tarde se introdujo el 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 else
bloque que sigue inmediatamente a la comprobación de un valor nulo, los programadores que agregaron las mejoras a las versiones futuras agregarán toda la lógica porque ahora tenemos una cadena de lógica que no fue intencionada para la regla original (que devuelve si el valor es nulo).
Presto mi creencia en gran medida a algunas de las pautas de C # en Codeplex (enlace a eso aquí: http://csharpguidelines.codeplex.com/ ) que establecen lo siguiente:
"Agregue un comentario descriptivo si se supone que el bloque predeterminado (si no) está vacío. Además, si no se llega a ese bloque, arroje una InvalidOperationException para detectar cambios futuros que pueden caer en los casos existentes. Esto garantiza un mejor código, porque se han pensado todos los caminos que puede recorrer el código ".
Creo que es una buena práctica de programación cuando se usan bloques lógicos como este tener siempre un bloque predeterminado agregado (si no, 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 involuntarias.