الجمل الشرطية المتداخلة (Nested If Statements)
| المفهوم أو الأداة البرمجية | آلية التنفيذ والتحكم في الذاكرة | التأثير البرمجي ونصيحة الهيكلة |
|---|---|---|
| الشرط المتداخل Nested If | كتابة بنية شرطية كاملة داخل كتلة شرطية أخرى تعلوها في المسافة البادئة | تُنفذ الشروط الداخلية فقط في حال نجاح الشرط الخارجي |
| التحقق التسلسلي | آلية برمجية تفحص الشروط الفرعية تدريجياً بناءً على نتائج الشروط الأساسية المعتمدة عليها | تستخدم لتنظيم العمليات اللوجستية المترابطة |
| المسافة البادئة المتراكمة | زيادة إزاحة الأكواد الداخلية بأربع مسافات إضافية عن كل مستوى تداخل جديد | إجبارية في بايثون لتحديد تبعية الكتل البرمجية الفرعية |
| مشكلة التداخل الزائد | تعقيد الكود وتشتيت المقروئية نتيجة كثرة مستويات الإزاحة نحو اليمين | يُنصح بتجنبها إذا تجاوزت ثلاثة مستويات لتفادي تشوه الشيفرة |
| الدمج بالعوامل المنطقية | استبدال التداخل الشرطي برابط منطقي مثل and لجمع الشروط في سطر واحد | البديل الاحترافي لتبسيط الأكواد وجعلها أكثر نظافة ومقروئية |
الجمل الشرطية المتداخلة (Nested If Statements) 1. مفهوم الجمل الشرطية المتداخلة وآلية عملها تُعرف الجمل الشرطية المتداخلة (Nested If Statements) بأنها عملية وضع بنية شرطية (if, elif, else) كاملة داخل كتلة شرطية أخرى. في هذه المعمارية، يُطلق على الشرط الأول اسم "الشرط الخارجي" (Outer Condition)، بينما تُسمى الشروط القابعة بداخله "الشروط الداخلية" (Inner Conditions).
لا يقوم محرك بايثون بالالتفات إلى الشروط الداخلية أو فحص قيمها في الذاكرة إلا في حالة واحدة فقط: وهي أن يعود الشرط الخارجي بالقيمة True. إذا سقط الشرط الخارجي وتحول إلى False، يتخطى المعالج الكتلة المتداخلة بالكامل قفزاً إلى السطور التالية.
مفهوم الجمل الشرطية المتداخلة وآلية عملها
| 1 | is_member = True |
| 2 | purchase_amount = 150 |
| 3 | |
| 4 | if is_member: # الشرط الخارجي |
| 5 | print("مرحباً بك في نظام الولاء.") |
| 6 | |
| 7 | if purchase_amount > 100: # شرط داخلي متداخل |
| 8 | print("لقد حصلت على خصم بقيمة 20%") |
| 9 | else: |
| 10 | print("احصل على خصم عند الشراء بأكثر من 100") |
| 11 | else: |
| 12 | print("تطبق الأسعار القياسية لغير الأعضاء.") |
بما أن بايثون تعتمد كلياً على الإزاحة الفراغية لتحديد نطاق الأكواد، فإن التداخل يتطلب دقة صارمة في توزيع المسافات:
تراكم هذه المسافات هو ما يعلِم المفسر بالتبعية اللوجستية والهيكلية لكل سطر كود.
تُعد الشروط المتداخلة خياراً هندسياً ممتازاً في الحالات التالية:
على الرغم من فاعلية هذا الأسلوب، إلا أن الإفراط في تداخل الجمل الشرطية (أكثر من 3 مستويات) يؤدي إلى مشكلة برمجية تُعرف باسم "كود السباغيتي" أو "هرم العذاب" (Pyramid of Doom)؛ حيث يزحف الكود نحو اليمين بشكل مفرط، مما يجعله غاية في التعقيد وصعب الصيانة والمقروئية.
الأسلوب السيئ (تداخل معقد):
| 1 | if user_exists: |
| 2 | if is_verified: |
| 3 | if has_balance: |
| 4 | # تنفيذ العملية - كود عميق وصعب القراءة |
| 5 | pass |
إذا كانت الشروط متتالية ومستقلة ويجب تحققها معاً في نفس اللحظة دون الحاجة لتقارير منفصلة لكل مرحلة، فإن المعيار القياسي لتطهير الكود (Refactoring) هو استخدام العوامل المنطقية (and) لدمج الشروط في مسار أفقي واحد ومسطح (Flat Code)، وهو ما يتماشى تماماً مع الفلسفة الرسمية للغة بايثون "المسطح أفضل من المتداخل" (Flat is better than nested).
الأسلوب الاحترافي (التبسيط والدمج):
| 1 | # كود نظيف، مسطح، وسهل التتبع والصيانة |
| 2 | if user_exists and is_verified and has_balance: |
| 3 | # تنفيذ العملية مباشرة |
| 4 | pass |
| 1 | # if متداخل |
| 2 | age = 22 |
| 3 | has_license = True |
| 4 | has_car = True |
| 5 | |
| 6 | if age >= 18: |
| 7 | print("سن قانوني") |
| 8 | if has_license: |
| 9 | print("لديه رخصة") |
| 10 | if has_car: |
| 11 | print("يمكنه القيادة!") |
| 12 | else: |
| 13 | print("لا يمتلك سيارة") |
| 14 | else: |
| 15 | print("لا يمتلك رخصة") |
| 16 | else: |
| 17 | print("صغير السن") |
مثال 1: نظام تسجيل الدخول
| 1 | username = "admin" |
| 2 | password = "1234" |
| 3 | |
| 4 | entered_user = input("اسم المستخدم: ") |
| 5 | if entered_user == username: |
| 6 | entered_pass = input("كلمة المرور: ") |
| 7 | if entered_pass == password: |
| 8 | print("تم تسجيل الدخول بنجاح!") |
| 9 | else: |
| 10 | print("كلمة المرور خاطئة") |
| 11 | else: |
| 12 | print("اسم المستخدم غير موجود") |