Un artículo más de Calidad de Software donde voy a comentar porqué es importante evitar el anidamiento de las sentencias if/else e introducir el concepto de Guard Clauses o Clausulas de Guarda.
¿Por qué deberías dejar de usar sentencias else?
Por artículos anteriores, ya sabrán que no soy muy amigo de la sentencia else. Como por ejemplo, en el artículo de «como evitar el anidamiento de «if/else y sentencias switch gracias al patrón Strategy» comentaba como evitar los if/else y switch con una estrategia más flexible. Pero es una solución algo compleja que no debe ser utilizada en todas las situaciones.
Así que, en este artículo vamos a ver una solución que debes tener en cuenta para convertirte en un mejor programador.
Mala practica: Sentencias IF anidadas
A veces nos encontramos que nuestro código contiene muchas sentencias IF dentro de sí mismo, lo que nos hace sospechar si algo está mal con esto o no. Por ejemplo, aquí tenemos nuestro modelo User
que contiene un método para enviar notificaciones donde solo se enviarán si se cumplen una serie de condiciones.
class User extends Model { const NOTIFICATION_NOT_SENT = 0; const NOTIFICATION_SUCCESSFULLY_SENT = 1; public function notify() { $user_id = $this->id; if ($this->isVerified($user_id)) { if ($this->hasNotificationsEnabled($user_id)) { if ($this->shouldUserBeNotified($user_id)) { $this->sendNotification(); return self::NOTIFICATION_SUCCESSFULLY_SENT; } else { return self::NOTIFICATION_NOT_SENT; } } else { throw new NotificationIsNotEnabled; } } else { throw new UserIsNotVerified; } } private function isVerified($user_id) {} private function hasNotificationsEnabled($user_id) {} private function shouldUserBeNotified($user_id) {} private function sendNotification($user_id) {} }
El código anterior en sí, no es incorrecto. Pero, si nos fijamos más detenidamente, nos daremos cuenta que tenemos tres sentencias if/else anidadas que contienen diferentes formas de tratar las devoluciones.
Además, estamos forzando a nuestro código a tener tres niveles de indentación (sangrado) que hacen más difícil leer nuestro código.
Y el último problema que podemos detectar es que, si tenemos una gran cantidad de código en los niveles más profundos del IF, debemos desplazarnos hasta el final del método para saber qué hacen cada uno de los ELSE.
Así que vamos a aplicar una técnica de refactorización llamada Guard Clauses.
Refactorizando código con Guard Clauses
La aplicación de las Guard Clasuses es una técnica muy fácil de hacer. La idea es negar las condiciones que tenemos en los IF y si se cumple dicha negación, ejecutamos el código que teníamos en el ELSE.
Veamos como aplicaríamos las clausulas de guarda en el ejemplo para que se termine de entender.
class User extends Model { const NOTIFICATION_NOT_SENT = 0; const NOTIFICATION_SUCCESSFULLY_SENT = 1; public function notify() { $user_id = $this->id; // Clausula de guarda: if (!$this->isVerified($user_id)) { throw new UserIsNotVerified; } // Clausula de guarda: if (!$this->hasNotificationsEnabled($user_id)) { throw new NotificationIsNotEnabled; } // Clausula de guarda: if (!$this->shouldUserBeNotified($user_id)) { return self::NOTIFICATION_NOT_SENT; } $this->sendNotification(); return self::NOTIFICATION_SUCCESSFULLY_SENT; } private function isVerified($user_id) {} private function hasNotificationsEnabled($user_id) {} private function shouldUserBeNotified($user_id) {} private function sendNotification($user_id) {} }
Beneficios
Los beneficios más destacados que podemos enumerar son:
- Código más legible (clean code).
- Flujo de código fácil de seguir.
- Reducción de los niveles de indentación.
- Tus futuros colegas que agarren el código, te amarán ❤.
Conclusión
Las clausulas de guarda son una buena practica, muy sencilla de aplicar y traen muchos beneficios de cara a nuestros desarrollos. Les recomiendo que comiencen a implementar las Clausulas de Guarda en sus proyectos y les aseguro que rápidamente notarán sus beneficios.
Espero que les haya gustado el artículo y si es así, házmelo saber en los comentarios de acá abajo y compartí el artículo en tus redes sociales. Nos vemos en la próxima 😉🤙.
Oye que padre super tip, te lo agradezco
Muchas gracias bro! Saludos.
muy buen tip
Muchas gracias.
Buen consejo, me gusta la forma cómo lo explicas.
Muchas gracias a vos Carlos por tu comentario! Saludos.
Gracias por el aporte!
Super todo, excelentes todos tus posts
genial. sencillo y practico
Excelente consejo
Muchas gracias!
Hola a todos… creo que fue en este blog en donde vi hace algún tiempo un articulo en donde explicaban como no usuar condiciones IF cuando son muchas y enrrarecen el código… Alguien puede referenciarmelo?
Gracas
Como estas bro? El artículo es este -> https://www.laraveltip.com/elimina-sentencias-if-else-y-switch-con-el-patron-estrategia/