Aplatir les conditionnelles imbriquées
Fait partie de la section Logique & Flux du Journey C# de Coddy — leçon 22 sur 66.
Les conditionnels imbriqués peuvent rendre votre code difficile à lire et à maintenir. L'aplatissement aide à améliorer la lisibilité en réduisant les niveaux d'indentation.
Voici un exemple de conditionnels profondément imbriqués :
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");
}
Nous pouvons aplatir cela en utilisant des retours anticipés ou des clauses de garde :
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();
Remarquez comment le code aplati présente moins d'indentation et est plus facile à suivre.
Défi
FacileDans la vérification de l'éligibilité aux bourses, des conditionnels profondément imbriqués rendent le code difficile à lire et à maintenir. Dans ce défi, vous transformerez une structure conditionnelle imbriquée désordonnée en un code propre et lisible en utilisant des clauses de garde.
Une clause de garde est une instruction de retour anticipé qui gère une condition spécifique immédiatement, permettant au reste de la fonction de se concentrer sur le « chemin heureux ».
Votre tâche est de compléter les clauses de garde partiellement implémentées dans la méthode CheckScholarshipEligibility selon ces règles :
- Si l'âge est inférieur à 17, retournez immédiatement "Not eligible due to age requirement"
- Si GPA ≥ 3.5 ET que l'étudiant a une recommandation, accordez une bourse complète
- Si GPA ≥ 3.8, accordez une bourse complète (même sans recommandation)
- Si GPA ≥ 3.0 ET que l'étudiant a une recommandation, accordez une bourse partielle
- Si GPA est entre 3.5 et 3.8, accordez une bourse partielle
- Pour tous les autres cas, retournez "Not eligible for scholarship"
Aide-mémoire
Les conditionnels imbriqués peuvent rendre le code difficile à lire et à maintenir. L'aplatissement aide à améliorer la lisibilité en réduisant les niveaux d'indentation.
Au lieu de conditionnels profondément imbriqués :
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");
}
Utilisez des retours précoces ou des clauses de garde pour aplatir la structure :
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();
Une clause de garde est une instruction de retour précoce qui gère une condition spécifique immédiatement, permettant au reste de la fonction de se concentrer sur le "happy path".
Essayez vous-même
using System;
class Program
{
public static void CheckScholarshipEligibility(int age, double gpa, bool hasRecommendation)
{
// Clause de garde pour l'exigence d'âge
if (age < 17)
{
Console.WriteLine("Not eligible due to age requirement.");
return;
}
// Clause de garde pour bourse complète avec recommandation
if (/* Compléter cette condition */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Clause de garde pour bourse complète avec GPA exceptionnel
if (/* Compléter cette condition */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Clause de garde pour bourse partielle avec recommandation
if (/* Compléter cette condition */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Clause de garde pour bourse partielle avec bon GPA
if (/* Compléter cette condition */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Cas par défaut : non éligible
Console.WriteLine("Not eligible for scholarship.");
}
static void Main(string[] args)
{
// Cas de test pour un retour immédiat
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);
}
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Tableaux multidimensionnels
Bases des tableaux 2DDéclaration et initialisation en 2DAccès aux éléments d'un tableau 2DBoucles imbriquées et tableaux 2DTableaux irréguliersOpérations matricielles courantesRécapitulatif - Multidimensionnel4Techniques de contrôle de flux
Retours anticipésClauses de gardeInstructions de saut (goto)Break et ContinueAplatir les conditionnelles imbriquées2Prise de décision avancée
Conditions multiplesLogique booléenne complexeComparaison If vs SwitchInstructions Switch imbriquéesRécapitulatif - Décisions avancées5Gestion des exceptions
Bases du Try-CatchTypes d'exceptionsBlocs Catch multiplesManipulation de fichiersLe bloc FinallyUsing vs Try-FinallyExceptions personnaliséesRécapitulatif - Gestion des erreurs3Améliorations des boucles
Performance des bouclesItération de structures complexesChaque type de boucleRefactorisation des bouclesRécapitulatif - Boucles optimisées6Gestion des valeurs nulles
Les bases des références nullesTypes valeur nullablesPatterns de vérification de nullitéProgrammation défensiveRécapitulatif - Null Safety