إعادة هيكلة الحلقات التكرارية
جزء من قسم Logic & Flow في رحلة C# على Coddy — الدرس 16 من 66.
إعادة هيكلة الحلقات (Refactoring loops) يمكن أن تحسن من قابلية قراءة الكود وقابلية صيانته.
استبدل الحلقة التقليدية بـ foreach للتبسيط:
string[] fruits = { "apple", "banana", "cherry" };
// قبل إعادة الهيكلة
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}
// بعد إعادة الهيكلة
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}استخراج منطق الحلقات المعقد إلى دوال (methods):
int[] numbers = { 1, 2, 3, 4, 5, 6 };
// قبل إعادة الهيكلة (refactoring)
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] % 2 == 0)
{
Console.WriteLine($"{numbers[i]} is even");
}
}
// بعد إعادة الهيكلة باستخدام دالة مساعدة
for (int i = 0; i < numbers.Length; i++)
{
if (IsEven(numbers[i]))
{
Console.WriteLine($"{numbers[i]} is even");
}
}
// دالة مساعدة
bool IsEven(int number)
{
return number % 2 == 0;
}قم بتقسيم الحلقات الكبيرة إلى حلقات أصغر وأكثر تركيزاً:
int[] data = { 1, 2, 3, 4, 5 };
// قبل: حلقة واحدة كبيرة تقوم بمهام متعددة
for (int i = 0; i < data.Length; i++)
{
// معالجة البيانات
data[i] = data[i] * 2;
// طباعة النتائج
Console.WriteLine(data[i]);
}
// بعد: حلقات منفصلة بأهداف واضحة
// معالجة البيانات
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2;
}
// طباعة النتائج
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
}التحدي
متوسطقم بإنشاء طريقة (method) تسمى refactorArrayFilter تقوم بما يلي:
- تأخذ مصفوفة من الأعداد الصحيحة كمعامل (parameter)
- تنفذ نسختين من الكود لحساب الأعداد التي تقبل القسمة على 3:
- النسخة الأصلية: استخدم حلقة for التقليدية مع جملة if
- النسخة المحسنة (Refactored): استخدم حلقة foreach مع استخراج المنطق إلى طريقة مساعدة (helper method)
- تعيد العدد الناتج من النسخة المحسنة كعدد صحيح
على سبيل المثال، إذا أعطيت المصفوفة [3, 4, 6, 7, 9]، يجب أن تعيد الطريقة القيمة 3 لأن هناك ثلاثة أرقام (3، 6، و 9) تقبل القسمة على 3.
ملاحظة: لا تحتاج لطباعة أي شيء - فقط قم بإعادة العدد كعدد صحيح.
ورقة مرجعية
استخدم foreach بدلاً من حلقات for التقليدية لتكرار المصفوفة بشكل أبسط:
// حلقة for التقليدية
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}
// تمت إعادة الهيكلة باستخدام foreach
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}استخرج منطق الحلقات المعقد إلى دوال مساعدة (helper methods):
// قبل إعادة الهيكلة
if (numbers[i] % 2 == 0)
{
Console.WriteLine($"{numbers[i]} is even");
}
// بعد إعادة الهيكلة باستخدام دالة مساعدة
if (IsEven(numbers[i]))
{
Console.WriteLine($"{numbers[i]} is even");
}
// دالة مساعدة
bool IsEven(int number)
{
return number % 2 == 0;
}قسّم الحلقات الكبيرة إلى حلقات أصغر ومركزة ذات مسؤوليات فردية:
// قبل: حلقة واحدة تقوم بأشياء متعددة
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2; // معالجة
Console.WriteLine(data[i]); // طباعة
}
// بعد: حلقات منفصلة بأغراض واضحة
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2; // معالجة فقط
}
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]); // طباعة فقط
}جرّب بنفسك
public class RefactorArrayFilter
{
// قم بتنفيذ طريقة refactorArrayFilter
public static int refactorArrayFilter(int[] numbers)
{
// اكتب الكود الخاص بك هنا
}
// قم بتنفيذ أي طرق مساعدة تحتاجها
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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