---
title: "Cláusulas de Guarda: Simplifica tu Código en 5 Minutos"
description: "Las cláusulas de guarda simplifican tus funciones, mejoran la legibilidad y reducen la complejidad cognitiva. Con ejemplos prácticos en PHP."
pubDate: "2024-05-26"
category: "arquitectura"
language: "es"
tags: ["buenas prácticas", "cláusulas-guarda", "código limpio", "legibilidad", "refactorización"]
---
import YouTubeEmbed from '../../components/YouTubeEmbed.astro';

Las cláusulas de guarda son una de esas técnicas pequeñas que cambian radicalmente la legibilidad del código sin apenas esfuerzo. Si todavía escribes funciones con tres niveles de `if-else` anidados, esto te interesa.

## ¿Qué son las cláusulas de guarda?

Una cláusula de guarda es un `if` al principio de la función que corta la ejecución si no se cumplen las condiciones necesarias. Manejas los casos excepcionales primero, sales pronto, y el resto de la función queda limpio. Te quitas niveles de indentación y bajas la carga cognitiva al leer el código.

## ¿Cómo implementar las cláusulas de guarda?

Lo primero es detectar los candidatos. Los casos clásicos son bloques con varios `if-else` anidados donde cada rama devuelve algo distinto o lanza una excepción.

Un ejemplo típico: comprobar si el usuario de un cliente tiene permisos para ejecutar una acción.

Antes de la refactorización:

```php
public function check(...) {
    if ($user) {
        if ($user->client()->hasFeature('XXX')) {
            if ($user->hasPermission('YYY')) {
                // do something
           } else {
                throw new ActionDenied();
            }
        } else {
            throw new FeatureNotEnabled();
        }
    } else {
        throw new UserNotFound();
    }
}
```

Como se puede ver el código queda muy anidado y poco legible, haciendo que tu carga cognitiva sea mayor ya que hay que ir teniendo en cuenta condiciones anteriores para entender el flujo del código.

Después de la refactorización:

```php
public function check(...) {
    if (!$user) {
        throw new UserNotFound();
    }

    if (!$user->client()->hasFeature('XXX')) {
        throw new FeatureNotEnabled();
    }

    if (!$user->hasPermission('YYY')) {
        throw new ActionDenied();
    }

    // do something
}
```

Cuando lo que se lanzan son excepciones, puedes ir un paso más allá y extraer cada bloque `if` a un método para que quede más semántico:

```php
public function check(....) {
    $this->ensureUserExists();
    $this->ensureClientHasFeatureEnabled();
    $this->ensureUserHasPermission();

    // do something
}

private function ensureUserExists() {
    if (!$user) {
        throw new UserNotFound();
    }
}

private function ensureClientHasFeatureEnabled() {
    if (!$user->client()->hasFeature('XXX')) {
        throw new FeatureNotEnabled();
    }
}

private function ensureUserHasPermission() {
    if (!$user->hasPermission('YYY')) {
        throw new ActionDenied();
    }
}
```

Con las cláusulas de guarda aplicadas, el código queda mucho más limpio y legible: los casos excepcionales se manejan al principio y puedes olvidarte de ellos en el resto de la función.

## Conclusiones

Las cláusulas de guarda son una de esas técnicas que, cuando las interiorizas, ya no puedes escribir código de otra forma. Simplifican la lógica, mejoran la legibilidad y dejan el flujo principal de la función sin ruido de validaciones.

Pruébalas, sobre todo combinadas con extraer cada guarda a un método con nombre semántico cuando las condiciones se compliquen. La diferencia en un code review se nota desde la primera PR.

También puedes pasarte por [mi canal de YouTube](https://www.youtube.com/@lmmartinbdev) para ver el vídeo sobre cláusulas de guarda:

<YouTubeEmbed videoId="3QjVGAKxXKA" title="¿Qué son las cláusulas de guarda?" />

PD: Si tenéis cualquier duda podéis poneros en contacto conmigo enviando un DM a [twitter](https://x.com/lm_martinbar).