Flatten Nested Conditionals
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ácilEn la verificación de elegibilidad para becas, las condicionales profundamente anidadas hacen que el código sea difícil de leer y mantener. En este desafío, transformarás una estructura condicional anidada desordenada en código limpio y legible usando cláusulas de guardia.
Una cláusula de guardia es una instrucción de retorno temprano que maneja una condición específica de inmediato, permitiendo que el resto de la función se enfoque en la ruta feliz.
Tu tarea es completar las cláusulas de guardia parcialmente implementadas en el método CheckScholarshipEligibility según estas reglas:
- Si la edad es menor que 17, devuelve "Not eligible due to age requirement" inmediatamente
- Si GPA ≥ 3.5 Y el estudiante tiene una recomendación, concede beca completa
- Si GPA ≥ 3.8, concede beca completa (incluso sin recomendación)
- Si GPA ≥ 3.0 Y el estudiante tiene una recomendación, concede beca parcial
- Si GPA está entre 3.5 y 3.8, concede beca parcial
- Para todos los demás casos, devuelve "Not eligible for scholarship"
Hoja de referencia
Las condicionales anidadas pueden hacer que el código sea difícil de leer y mantener. Aplanarlas ayuda a mejorar la legibilidad reduciendo los niveles de indentación.
En lugar de condicionales profundamente anidadas:
if (userLoggedIn)
{
if (userHasPermission)
{
if (fileExists)
{
// Process the file
ProcessFile();
}
else
{
Console.WriteLine("File not found");
}
}
else
{
Console.WriteLine("No permission");
}
}
else
{
Console.WriteLine("Not logged in");
}
Usa retornos tempranos o cláusulas de guardia para aplanar la estructura:
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();
Una cláusula de guardia es una instrucción de retorno temprano que maneja una condición específica de inmediato, permitiendo que el resto de la función se enfoque en la "ruta feliz".
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
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety