Cláusulas de Guarda: Simplifica tu Código en 5 Minutos

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:

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:

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:

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 para ver el vídeo sobre cláusulas de guarda:

PD: Si tenéis cualquier duda podéis poneros en contacto conmigo enviando un DM a twitter.

Luis Miguel Martín
Luis Miguel Martín

CTO en LCApps. Escribo sobre Claude Code, MCP, agentes IA y arquitectura de software real.

💡

¿Te ha gustado este artículo?

Descubre patrones de diseño, decisiones técnicas y arquitecturas escalables.