Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تسطيح الشروط المتداخلة

جزء من قسم Logic & Flow في رحلة C# على Coddy — الدرس 22 من 66.

يمكن أن تجعل الشروط المتداخلة كودك صعب القراءة والصيانة. يساعد التسطيح في تحسين قابلية القراءة من خلال تقليل مستويات الإزاحة.

إليك مثال على الشروط المتداخلة بعمق:

if (userLoggedIn)
{
    if (userHasPermission)
    {
        if (fileExists)
        {
            // معالجة الملف
            ProcessFile();
        }
        else
        {
            Console.WriteLine("File not found");
        }
    }
    else
    {
        Console.WriteLine("No permission");
    }
}
else
{
    Console.WriteLine("Not logged in");
}

يمكننا تبسيط هذا الهيكل باستخدام العودة المبكرة (early returns) أو جمل الحماية (guard clauses):

if (!userLoggedIn)
{
    Console.WriteLine("Not logged in");
    return;
}

if (!userHasPermission)
{
    Console.WriteLine("No permission");
    return;
}

if (!fileExists)
{
    Console.WriteLine("File not found");
    return;
}

// معالجة الملف
ProcessFile();

لاحظ كيف أن الكود المسطح يحتوي على مسافات بادئة أقل وأنه أسهل في المتابعة.

challenge icon

التحدي

سهل

في عملية التحقق من الأهلية للمنح الدراسية، تجعل الشروط المتداخلة بعمق (nested conditionals) الكود صعب القراءة والصيانة. في هذا التحدي، ستقوم بتحويل هيكل شرطي متداخل وفوضوي إلى كود نظيف وقابل للقراءة باستخدام guard clauses.

جملة الحماية (guard clause) هي عبارة عن بيان عودة مبكر (early return statement) يعالج حالة معينة على الفور، مما يسمح لبقية الدالة بالتركيز على "المسار السعيد" (happy path).

مهمتك هي إكمال جمل الحماية المنفذة جزئيًا في طريقة CheckScholarshipEligibility وفقًا لهذه القواعد:

  1. إذا كان العمر أقل من 17، قم بإرجاع "Not eligible due to age requirement" فورًا
  2. إذا كان المعدل التراكمي (GPA) ≥ 3.5 وكان لدى الطالب توصية، امنح منحة كاملة "Full scholarship granted!"
  3. إذا كان المعدل التراكمي (GPA) ≥ 3.8، امنح منحة كاملة "Full scholarship granted!" (حتى بدون توصية)
  4. إذا كان المعدل التراكمي (GPA) ≥ 3.0 وكان لدى الطالب توصية، امنح منحة جزئية "Partial scholarship granted."
  5. إذا كان المعدل التراكمي (GPA) بين 3.5 و 3.8، امنح منحة جزئية "Partial scholarship granted."
  6. لجميع الحالات الأخرى، قم بإرجاع "Not eligible for scholarship."

ورقة مرجعية

يمكن أن تجعل الشروط المتداخلة الكود صعب القراءة والصيانة. يساعد التبسيط (Flattening) في تحسين القراءة من خلال تقليل مستويات الإزاحة.

بدلاً من الشروط المتداخلة بعمق:

if (userLoggedIn)
{
    if (userHasPermission)
    {
        if (fileExists)
        {
            // معالجة الملف
            ProcessFile();
        }
        else
        {
            Console.WriteLine("File not found");
        }
    }
    else
    {
        Console.WriteLine("No permission");
    }
}
else
{
    Console.WriteLine("Not logged in");
}

استخدم العودة المبكرة (early returns) أو عبارات الحماية (guard clauses) لتبسيط الهيكل:

if (!userLoggedIn)
{
    Console.WriteLine("Not logged in");
    return;
}

if (!userHasPermission)
{
    Console.WriteLine("No permission");
    return;
}

if (!fileExists)
{
    Console.WriteLine("File not found");
    return;
}

// معالجة الملف
ProcessFile();

عبارة الحماية (guard clause) هي عبارة عودة مبكرة تعالج شرطاً معيناً على الفور، مما يسمح لبقية الدالة بالتركيز على "المسار السعيد" (happy path).

جرّب بنفسك

using System;

class Program
{
    public static void CheckScholarshipEligibility(int age, double gpa, bool hasRecommendation)
    {
        // شرط الحماية لمتطلبات العمر
        if (age < 17)
        {
            Console.WriteLine("Not eligible due to age requirement.");
            return;
        }
        
        // شرط الحماية للمنحة الكاملة مع التوصية
        if (/* أكمل هذا الشرط */)
        {
            Console.WriteLine("Full scholarship granted!");
            return;
        }
        
        // شرط الحماية للمنحة الكاملة مع معدل تراكمي استثنائي
        if (/* أكمل هذا الشرط */)
        {
            Console.WriteLine("Full scholarship granted!");
            return;
        }
        
        // شرط الحماية للمنحة الجزئية مع التوصية
        if (/* أكمل هذا الشرط */)
        {
            Console.WriteLine("Partial scholarship granted.");
            return;
        }
        
        // شرط الحماية للمنحة الجزئية مع معدل تراكمي جيد
        if (/* أكمل هذا الشرط */)
        {
            Console.WriteLine("Partial scholarship granted.");
            return;
        }
        
        // الحالة الافتراضية: غير مؤهل
        Console.WriteLine("Not eligible for scholarship.");
    }
    
    static void Main(string[] args)
    {
        // حالات اختبار للتغذية الراجعة الفورية
        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);
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow