Aplanar condicionales anidados
Parte de la sección Lógica y Flujo del Journey de C# de Coddy. Lección 22 de 66.
Las condicionales anidadas pueden hacer que tu código sea difícil de leer y mantener. Aplanarlas ayuda a mejorar la legibilidad al reducir los niveles de indentación.
Aquí hay un ejemplo de condicionales profundamente anidados:
if (userLoggedIn)
{
if (userHasPermission)
{
if (fileExists)
{
// Procesar el archivo
ProcessFile();
}
else
{
Console.WriteLine("File not found");
}
}
else
{
Console.WriteLine("No permission");
}
}
else
{
Console.WriteLine("Not logged in");
}
Podemos aplanar esto usando retornos tempranos o cláusulas de guardia:
if (!userLoggedIn)
{
Console.WriteLine("Not logged in");
return;
}
if (!userHasPermission)
{
Console.WriteLine("No permission");
return;
}
if (!fileExists)
{
Console.WriteLine("File not found");
return;
}
// Process the file
ProcessFile();
Observa cómo el código aplanado tiene menos sangría y es más fácil de seguir.
Desafío
FácilAl comprobar la elegibilidad para una beca, los condicionales profundamente anidados hacen que el código sea difícil de leer y mantener. En este desafío, transformarás una estructura condicional anidada desordenada en un código limpio y legible mediante cláusulas de guarda.
Una cláusula de guarda es una instrucción de retorno anticipado que gestiona una condición específica de inmediato, lo que permite que el resto de la función se centre en el «camino feliz».
Tu tarea es completar las cláusulas de guarda implementadas parcialmente en el método CheckScholarshipEligibility de acuerdo con estas reglas:
- Si la edad es menor que 17, devuelve inmediatamente «No cumple los requisitos debido al requisito de edad»
- Si el GPA ≥ 3.5 Y el estudiante tiene una recomendación, concede una beca completa
- Si el GPA ≥ 3.8, concede una beca completa (incluso sin recomendación)
- Si el GPA ≥ 3.0 Y el estudiante tiene una recomendación, concede una beca parcial
- Si el GPA está entre 3.5 y 3.8, concede una beca parcial
- Para todos los demás casos, devuelve «No cumple los requisitos para la beca»
Pruébalo tú mismo
using System;
class Program
{
public static void CheckScholarshipEligibility(int age, double gpa, bool hasRecommendation)
{
// Cláusula de guardia para el requisito de edad
if (age < 17)
{
Console.WriteLine("Not eligible due to age requirement.");
return;
}
// Cláusula de guardia para beca completa con recomendación
if (/* Completa esta condición */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Cláusula de guardia para beca completa con GPA excepcional
if (/* Completa esta condición */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Cláusula de guardia para beca parcial con recomendación
if (/* Completa esta condición */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Cláusula de guardia para beca parcial con buen GPA
if (/* Completa esta condición */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Caso predeterminado: no elegible
Console.WriteLine("Not eligible for scholarship.");
}
static void Main(string[] args)
{
// Casos de prueba para retroalimentación inmediata
Console.WriteLine("Test Case 1: Age 16, GPA 4.0, Has Recommendation: True");
CheckScholarshipEligibility(16, 4.0, true);
Console.WriteLine("\nTest Case 2: Age 18, GPA 3.9, Has Recommendation: False");
CheckScholarshipEligibility(18, 3.9, false);
Console.WriteLine("\nTest Case 3: Age 17, GPA 3.6, Has Recommendation: True");
CheckScholarshipEligibility(17, 3.6, true);
Console.WriteLine("\nTest Case 4: Age 19, GPA 3.2, Has Recommendation: True");
CheckScholarshipEligibility(19, 3.2, true);
Console.WriteLine("\nTest Case 5: Age 18, GPA 2.8, Has Recommendation: False");
CheckScholarshipEligibility(18, 2.8, false);
}
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Arrays multidimensionales
Conceptos básicos de arrays 2DDeclaración e inicialización de arrays 2DAcceso a elementos de arrays 2DBucles anidados con arrays 2DArrays irregularesOperaciones comunes con matricesRepaso: arrays multidimensionales4Técnicas de control de flujo
Retornos anticipadosCláusulas de guardaSentencias de salto (goto)Break y ContinueAplanar condicionales anidados7Operadores lógicos avanzados
Evaluación de cortocircuitoOperadores lógicos condicionalesPrecedencia de operadoresRepaso: operadores avanzados2Toma de decisiones avanzada
Múltiples condicionesLógica booleana complejaComparación entre If y SwitchSentencias Switch anidadasRepaso: decisiones avanzadas5Manejo de excepciones
Fundamentos de Try-CatchTipos de excepcionesMúltiples bloques CatchTrabajo con archivosBloque FinallyUso de Using frente a Try-FinallyExcepciones personalizadasRepaso: manejo de errores3Mejoras de bucles
Rendimiento de buclesIteración de estructuras complejasCada tipo de bucleRefactorización de buclesRepaso: bucles optimizados6Manejo de valores nulos
Conceptos básicos de referencias nulasTipos de valor anulablesPatrones de comprobación de valores nulosProgramación defensivaRepaso: seguridad frente a valores nulosPractica por tu cuenta: Compilador de C# online