Regla
Utilice temprano devoluciones y protección cláusulas.
En profundidad profundo y tardía parámetro validación
hacer funciones más difíciles a leer y mantener.
Idiomas admitidos: 45+Introducción
Las cláusulas de guarda validan las precondiciones al inicio de una función y retornan inmediatamente si no se cumplen las condiciones. Esto reduce el anidamiento al manejar los casos de error de antemano, dejando la lógica principal sin anidamientos y fácil de leer. Las funciones que validan parámetros a mitad de su ejecución o anidan rutas de éxito dentro de múltiples condicionales obligan a los lectores a seguir el contexto a través de muchos niveles de indentación.
Por qué es importante
Legibilidad del código: Las cláusulas de guarda hacen visible el "happy path" al final de la función sin anidamiento. Los lectores ven todas las condiciones de error de antemano y luego leen la lógica principal en un único nivel de indentación sin tener que seguir mentalmente múltiples condiciones anidadas.
Mantenimiento y modificación: Añadir nuevas condiciones de validación o error a código profundamente anidado requiere una colocación cuidadosa para evitar romper la lógica existente. Las cláusulas de guarda en la parte superior permiten añadir nuevas comprobaciones sin tocar la lógica principal, reduciendo el riesgo de introducir errores.
Ejemplos de código
❌ No conforme:
function processPayment(user, amount) {
if (user) {
if (user.isActive) {
if (amount > 0) {
if (user.balance >= amount) {
user.balance -= amount;
return { success: true, newBalance: user.balance };
} else {
return { success: false, error: 'Insufficient funds' };
}
} else {
return { success: false, error: 'Invalid amount' };
}
} else {
return { success: false, error: 'Inactive user' };
}
} else {
return { success: false, error: 'User required' };
}
}Por qué está mal: Cuatro niveles de anidamiento ocultan la lógica principal (deducción de saldo) en lo profundo de la función. Cada condición de error añade otro nivel de indentación, haciendo que el "happy path" sea difícil de encontrar y entender a simple vista.
✅ Conforme:
function processPayment(user, amount) {
if (!user) {
return { success: false, error: 'User required' };
}
if (!user.isActive) {
return { success: false, error: 'Inactive user' };
}
if (amount <= 0) {
return { success: false, error: 'Invalid amount' };
}
if (user.balance < amount) {
return { success: false, error: 'Insufficient funds' };
}
user.balance -= amount;
return { success: true, newBalance: user.balance };
}
Por qué esto es importante: Las cláusulas de guarda validan todas las precondiciones con retornos anticipados, manteniendo la función en un único nivel de indentación. La ruta feliz (deducción de saldo) es claramente visible al final sin anidamiento, lo que facilita la lectura y modificación de la función.
Conclusión
Validar las entradas y gestionar los casos de error al inicio de las funciones mediante cláusulas de guarda. Retornar anticipadamente cuando las condiciones fallen en lugar de anidar la ruta de éxito. Esto mantiene el código plano, legible y fácil de modificar sin romper la lógica existente.
.avif)
