جملة if / else if / else
جملة if / else if / else
كل برنامج يحتاج في مرحلة ما إلى اتخاذ قرار: نفّذ هذا الكود فقط إذا كان شيء ما صحيحًا، أو اختَر بين عدة مسارات بحسب قيمة معينة. جملة if في Java هي الأداة الأساسية لهذا النوع من التفريع. أنت تعرف بالفعل ما تُنتجه التعبيرات المنطقية (من الدرس السابق)؛ والآن ستتعلم كيف تتصرف بناءً عليها.
كتلة if الأساسية
تُقيّم جملة if تعبيرًا منطقيًا. عندما يكون التعبير true تنفّذ الكتلة؛ وعندما يكون false يتخطّاها Java تمامًا.
تُعرّف الأقواس المعقوصة { } الكتلة — مجموعة الجمل التي تنتمي إلى هذا الفرع. يمكنك وضع أي عدد من الجمل بداخلها.
إضافة فرع else
يوفّر فرع else البديل — الكود الذي يُنفَّذ عندما يكون شرط if خاطئًا (false).
سيُنفَّذ واحد بالضبط من الفرعين — لا كلاهما معًا، ولا لا شيء منهما. هذا هو الضمان الذي يمنحك إياه تركيب if / else.
التسلسل مع else if
عندما تكون هناك أكثر من حالتين محتملتين، تُسلسل شروطًا إضافية باستخدام else if. تُقيّمها Java من الأعلى إلى الأسفل وتنفّذ أول فرع يكون شرطه true، ثم تتخطّى جميع ما بعده.
score >= 60 في الأعلى، لطبعت درجة 95 التقدير "D" — وهذا خطأ واضح. فكّر دومًا في أضيق نطاق وضعه أولًا.
جمل if المتداخلة
يمكنك وضع جملة if داخل كتلة if أخرى. يُسمى هذا التداخل، وهو مفيد عندما لا تكون القرار الثاني منطقيًا إلا بعد حسم القرار الأول.
&&، ||) لدمج الشروط في جملة if واحدة. التداخل العميق يجعل الكود صعب القراءة وصعب الاختبار.
فخ else المعلَّق (Dangling-else)
انظر إلى هذا الكود الغامض:
يبدو المسافة البادئة وكأن else مقترن بـ if (x > 0) الخارجية، لكن قاعدة Java هي: دائمًا تنتمي else إلى أقرب if سابقة لا تمتلك else بعد. لذا تقترن else هنا بـ if (x > 10). بالنسبة لـ x = 5، الشرط الخارجي صحيح لكن الداخلي خاطئ، فتُنفَّذ else وتطبع "ليس موجبًا" — رغم أن 5 موجبة فعلًا. هذه هي خطأ else المعلَّق الكلاسيكي.
{ } حول كل جسم. حينئذٍ لا يمكن للمسافة البادئة وتفسير المُترجم أن يختلفا.
فخ غياب الأقواس المعقوصة
فخ مشابه: حذف الأقواس ثم إضافة جملة ثانية لاحقًا إلى الجسم.
الـ println الثانية خارج الـ if تمامًا. لأنه لا توجد أقواس، فقط الجملة الأولى بعد if هي المشروطة. ستطبع "جارٍ تحميل لوحة المدير..." لكل مستخدم. هذا خطأ حقيقي وخفي يشبه ثغرات الأمان. الحل هو نفسه: استخدم الأقواس دائمًا.
تجميع كل شيء معًا
إليك مثالًا صغيرًا مكتفيًا بذاته يستخدم التفريع لوصف إشارة المرور:
== من أن متغيرين يشيران إلى نفس الكائن في الذاكرة، وليس من تساوي محتواهما. لمقارنة محتوى النصوص استخدم دائمًا .equals() أو .equalsIgnoreCase().
الخلاصة
- تُنفَّذ كتلة
ifفقط عندما يكون شرطهاtrue. - يوفّر
elseالمسار البديل عندما لا يكون أي شرط سابقtrue. - يُسلسل
else ifشروطًا إضافية؛ وتختار Java أول تطابق وتتجاهل الباقي. - تُقيَّم الشروط من الأعلى إلى الأسفل — ضع الفحص الأكثر تحديدًا أولًا.
- التداخل مسموح به لكن يجب إبقاؤه ضحلًا؛ يُفضَّل استخدام المعاملات المنطقية لدمج الشروط عند الإمكان.
- ضع دائمًا الأقواس المعقوصة حول أجسام
ifوelse ifوelseلتجنّب فخّي else المعلَّق وغياب الأقواس.