Object Calisthenics – No usar la palabra clave Else
De todas las reglas de Object Calisthenics, yo diría que esta es la mas fácil de entender y de explicar, tan sencillo como tratar de no usar la estructura if/else,
¿ Ya está ? ¿ Esto es todo ?
Bueno, tanto como todo no es, un if/else, aunque no siempre, en muchas ocasiones se puede sustituir por un switch case o o switch statement, aunque a mi personalmente no es una práctica que me guste demasiado en este caso.
Aunque seguro que muchos pensareis…
¿Y si en un momento dado mi aplicación crece y necesito el switch case para añadir diferentes nuevos casos de uso?
Bueno, pues si piensas así, desde mi punto de vista estarás muy probablemente, en toda tu aplicación añadiendo una sobre ingeniería innecesaria. ( aunque como digo esto no es mas una opinión personal ).
Mejor tratemos de refactorizar esta estructura aplicando otras alternativas que nos ofrece la Programación Orientada a Objetos, como bien puede ser el polimorfismo ( del cual no voy a hablar ), o bien podemos usar el patrón de diseño Null Object Pattern, del cual os dejo aquí un repositorio en el que podéis ver un ejemplo limpio de como se podría utilizar
Ejemplo de Null Object Pattern
Y…. ¿ nunca debemos usar if/else ?
Pues yo aconsejaría tajantemente no usarlo nunca, pues es un claro síntoma de que el código no va a estar bien estructurado, para mi es un Code Smell, además posiblemente te va a obligar a introducir ciertas líneas de código repetidas en algunos casos, no vas a tener código reutilizable, la organización, claridad y limpieza de tu código no va a estar optimizada y un largo etcétera.
Otra forma de refactorizar este código es ( y la que a mi para una instrucción tan simple es la que mas me gusta y la que mas uso ) el Early Return, o Cláusula Guarda, los cuales nos garantizan detectar en primer lugar un posible error de datos de entrada, o bien un caso que no cumple una de las reglas de uso de nuestro negocio, de esta forma, por decirlo de alguna manera, rompemos la función, saliendo de ella lo antes posible y no tenemos por qué estar realizando comprobaciones posteriores innecesarias, ya que conocemos que esta premisa no cumple nuestro negocio, o va a causar un error.
Pero como siempre veamos un sencillo ejemplo de esto:
public class Robot
{
private int Position = 0;
public int Avanzar(int pasos)
{
if (pasos > 0)
{
Position += pasos;
}
else
{
throw new InvalidPositionException("Posición no válida");
}
return Position;
}
}
Lenguaje del código: PHP (php)
Imaginemos que tenemos una clase Robot, como vemos en el código, con un método Avanzar(), pues centrémonos en ese método, cuando llamamos a Avanzar(), se comprueba que los pasos sean mayor que 0, y si son mayor que 0 avanzamos y si no lanzamos una excepción controlada y customizada por nosotros mismos, ya que si no retrocederíamos al Robot y el método se llama claramente Avanzar(). Pues bien, para este caso vamos a usar el Early Return o Cláusula Guarda, para refactorizar el código y vamos a ver de una forma rápida como cambia la perspectiva:
public class Robot
{
private int Position = 0;
public int Avanzar(int pasos)
{
if (pasos < 0)
{
throw new InvalidPositionException("Posición no válida");
}
return Position += pasos;
}
}
Lenguaje del código: PHP (php)
Con este refactor, nos fijamos que lo primero que comprobamos es que pasos no sea menor que 0, y si lo es lanzamos una Excepción y salimos del método, a diferencia del código original, donde comprobamos si Pasos es mayor que 0, y si no lanzamos la Excepción, yo creo que se ve bastante claro el cambio, y se denota que el código queda mas claro y mas limpio.
Incluso con este último refactor, si ya nos ponemos muy tikismikis, podríamos refactorizarlo a un Operador Ternario, y para mi gusto nos quedaría así de bonito:
public class Robot
{
private int Position = 0;
public int Avanzar(int pasos)
{
return pasos < 0 ?
throw new InvalidPositionException("Posición no válida") :
(Position += pasos);
}
}
Lenguaje del código: PHP (php)
Hola amigo!
Variant “tikismikis”…. mal!!!
linea larga…
PS: Disculpe mi espanol.
Buenos días LEV,
Espero que de esta forma lo veas mas claro 🙂
Como siempre, gracias por leerme!
Buen dia!