Para explicar que son las guard clauses o clausulas de guarda y que beneficios tienen, vamos a poner primero un ejemplo de código en el cual no se usan para ver que problemas tiene y cómo las guard clauses nos pueden ayudar a solucionarlos.
public function divide(int $divider): float { if ($this->getValue() > 0) { if ($divider > 0) { if ( $divider != 1) { return $this->getValue()/$divider; } else { return $this->getValue(); } } else { throw new Exception('División por cero.'); } } else { return 0; } }
Problemas que nos encontramos en el ejemplo
Indentación excesiva
Al tener varios IFs anidados la indentación se nos va demasiado hacia la derecha dificultando la lectura del código.
Correlación de IF con ELSE
En este ejemplo igual no es demasiado complicado, pero si cada parte del IF y/o ELSE tuviera un poco más de código, nos costaría saber que IF va con que ELSE bajando hasta la correspondiente línea.
Seguir la traza mentalmente
Tal cómo está, nos obligaría al leer la función a seguir la traza y mantener la “pila” de condiciones mentalmente. Llego a la linea 6 porque ni el valor del objeto actual es 0, el divisor es mayor que 0 y distinto de 1.
Guard clauses es la solución
public function divide(int $divider): float { if ($this->getValue() = 0) { return 0; } if ($divider == 0) { throw new Exception('División por cero.'); } if ($divider == 1) { return $this->getValue(); } return $this->getValue()/$divider; }
Cómo vemos, con las guard clauses vamos comprobando primero una a una todas las condiciones que se deben cumplir antes de hacer lo que la función tiene que hacer, solucionando toso los problemas anteriores, indentación excesiva, no tenemos que saber que IF va con que ELSE, y por último y diría que más importante, no debemos mantener la “pila” de condiciones de la traza mentalmente.
Si es el valor actual del objeto es igual a 0 devuelvo 0, sinó continuo y me “olvido” de esa condición porque ya la he cumplido.