تسطيح الشروط المتداخلة
جزء من قسم 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();
لاحظ كيف أن الكود المسطح يحتوي على مسافات بادئة أقل وأنه أسهل في المتابعة.
التحدي
سهلفي عملية التحقق من الأهلية للمنح الدراسية، تجعل الشروط المتداخلة بعمق (nested conditionals) الكود صعب القراءة والصيانة. في هذا التحدي، ستقوم بتحويل هيكل شرطي متداخل وفوضوي إلى كود نظيف وقابل للقراءة باستخدام guard clauses.
جملة الحماية (guard clause) هي عبارة عن بيان عودة مبكر (early return statement) يعالج حالة معينة على الفور، مما يسمح لبقية الدالة بالتركيز على "المسار السعيد" (happy path).
مهمتك هي إكمال جمل الحماية المنفذة جزئيًا في طريقة CheckScholarshipEligibility وفقًا لهذه القواعد:
- إذا كان العمر أقل من 17، قم بإرجاع "Not eligible due to age requirement" فورًا
- إذا كان المعدل التراكمي (GPA) ≥ 3.5 وكان لدى الطالب توصية، امنح منحة كاملة "Full scholarship granted!"
- إذا كان المعدل التراكمي (GPA) ≥ 3.8، امنح منحة كاملة "Full scholarship granted!" (حتى بدون توصية)
- إذا كان المعدل التراكمي (GPA) ≥ 3.0 وكان لدى الطالب توصية، امنح منحة جزئية "Partial scholarship granted."
- إذا كان المعدل التراكمي (GPA) بين 3.5 و 3.8، امنح منحة جزئية "Partial scholarship granted."
- لجميع الحالات الأخرى، قم بإرجاع "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);
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادتعريف وتهيئة المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادالمصفوفات المتعرجة (Jagged Arrays)عمليات المصفوفات الشائعةمراجعة - المصفوفات متعددة الأبعاد4تقنيات التحكم في التدفق
الإرجاع المبكرشروط الحمايةجمل القفز (goto)Break و Continueتسطيح الشروط المتداخلة7المعاملات المنطقية المتقدمة
التقييم المختصرالمعاملات المنطقية الشرطيةأولوية المعاملاتمراجعة - المعاملات المتقدمة2اتخاذ القرارات المتقدم
الشروط المتعددةالمنطق البولياني المعقدمقارنة بين If و Switchجمل Switch المتداخلةمراجعة - القرارات المتقدمة5معالجة الاستثناءات
أساسيات Try-Catchأنواع الاستثناءاتكتل Catch المتعددةالتعامل مع الملفاتكتلة FinallyUsing مقابل Try-Finallyاستثناءات مخصصةمراجعة - معالجة الأخطاء8نظام تحليل البيانات
إعداد جمع البياناتمنطق إدخال البيانات11HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمملخص - HashSet3تحسينات الحلقات التكرارية
أداء الحلقات التكراريةالتكرار عبر البيانات المعقدةأنواع الحلقات التكراريةإعادة هيكلة الحلقات التكراريةملخص - الحلقات المحسنة6التعامل مع الـ Null
أساسيات الـ Null Referenceأنواع القيم القابلة للـ Nullأنماط التحقق من الـ Nullالبرمجة الدفاعيةملخص - أمان الـ Null