التحكّم في التدفّق والحلقات

العوامل المنطقية والتقييم المختصر

15 دقيقة الدرس 3 من 14

العوامل المنطقية والتقييم المختصر

في الدرس السابق تعلّمت كيفية كتابة كتل if / else if / else. في البرامج الحقيقية تحتاج دائمًا تقريبًا إلى فحص أكثر من شرط في آنٍ واحد — مثلًا: "هل المستخدم مسجّل الدخول وعمره كافٍ؟" أو "هل فشل الاتصال أو أعاد الخادم خطأ؟". تمنحك Java ثلاثة عوامل منطقية لدمج التعبيرات البوليانية: && و|| و!.

عامل AND: &&

يُنتج && القيمة true فقط عندما يكون كلا الطرفين true. فكّر فيه بمعنى "هذا الشرط وذاك يجب أن يتحقّقا معًا."

int age = 20; boolean hasTicket = true; if (age >= 18 && hasTicket) { System.out.println("تم منح الدخول."); } else { System.out.println("تم رفض الدخول."); } // الناتج: تم منح الدخول.

إذا كان أي طرف false فإن التعبير كله يصبح false. جدول الحقيقة:

  • true && truetrue
  • true && falsefalse
  • false && truefalse
  • false && falsefalse

عامل OR: ||

يُنتج || القيمة true عندما يكون طرف واحد على الأقل true. فكّر فيه بمعنى "يكفي تحقّق هذا أو ذاك."

boolean isAdmin = false; boolean isModerator = true; if (isAdmin || isModerator) { System.out.println("تم منح الوصول إلى لوحة التحكم."); } // الناتج: تم منح الوصول إلى لوحة التحكم.
  • true || truetrue
  • true || falsetrue
  • false || truetrue
  • false || falsefalse

عامل NOT: !

يعكس ! القيمة البوليانية. وهو عامل أحادي — يأخذ معاملًا واحدًا فقط ويقلبه.

boolean isLoggedIn = false; if (!isLoggedIn) { System.out.println("يرجى تسجيل الدخول أولًا."); } // الناتج: يرجى تسجيل الدخول أولًا.
نصيحة — الوضوح: تجنّب النفي المزدوج مثل if (!isNotEmpty). أعِد تسمية المتغيّر إلى isEmpty واكتب if (isEmpty). الكود الذي يُقرأ كالجملة العربية أسهل في الصيانة.

التقييم المختصر (Short-Circuit)

هذا من أهم ما يجب فهمه في عاملَي && و||. Java لا تُقيّم دائمًا كلا طرفَي التعبير المنطقي — بل تتوقّف فور أن يتحدّد الناتج.

  • مع &&: إذا كان الطرف الأيسر false فالناتج بات false يقينًا، وبالتالي يُتجاهل الطرف الأيمن كليًا.
  • مع ||: إذا كان الطرف الأيسر true فالناتج بات true يقينًا، وبالتالي يُتجاهل الطرف الأيمن كليًا.

هذا ليس مجرد تحسين للأداء — بل يمنع الأخطاء فعليًا. المثال الكلاسيكي هو حماية المرجع الفارغ قبل استخدامه:

String name = null; // بدون التقييم المختصر كان سيُطلق NullPointerException. // لأن name == null يساوي true، لا يُنفَّذ الطرف الأيمن أبدًا. if (name == null || name.isEmpty()) { System.out.println("الاسم فارغ."); } // الناتج: الاسم فارغ.

لو قيّمت Java كلا الطرفين دون استثناء لانهار البرنامج عند name.isEmpty() لأن name قيمتها null. التقييم المختصر يجعل نمط الحماية هذا آمنًا تمامًا.

// حماية حدود المصفوفة قبل الوصول إلى عنصر int[] scores = {90, 85, 78}; int index = 5; if (index >= 0 && index < scores.length && scores[index] > 80) { System.out.println("درجة عالية في الموضع " + index); } else { System.out.println("الفهرس خارج النطاق أو الدرجة ليست عالية."); } // الناتج: الفهرس خارج النطاق أو الدرجة ليست عالية. // لم يُصل إلى scores[index] أبدًا لأن index < scores.length كانت false أولًا.
فكرة أساسية: ضع دائمًا الفحص الأأمن أو الأقل تكلفةً في اليسار. مع && ضع فحص القيمة الفارغة أو حدود المصفوفة على اليسار حتى لا تُنفَّذ العملية الخطرة على اليمين إلا حين يكون ذلك آمنًا.

تركيب عدّة عوامل

يمكنك تسلسل عدّة عوامل منطقية في تعبير واحد. تُقيّم Java العامل ! أولًا، ثم &&، ثم || (الأولويات المعيارية). استخدم الأقواس لتوضيح نيّتك وتجنّب المفاجآت:

int temperature = 22; boolean isSunny = true; boolean isWeekend = false; // هل اليوم مناسب للخروج؟ boolean goodDay = isSunny && (temperature > 15) && !isWeekend; System.out.println("يوم جيد للخروج: " + goodDay); // isSunny=true, temperature>15=true, !isWeekend=!false=true => true // الناتج: يوم جيد للخروج: true
فخ شائع — أولوية العوامل: التعبير a || b && c يُفسَّر كـ a || (b && c) لأن && يربط أشدّ من ||. عند الشك استخدم الأقواس؛ لا تكلفة لها وتزيل كل التباس.

التأثيرات الجانبية والتقييم المختصر

نظرًا لأن الطرف الأيمن قد لا يُنفَّذ، تجنّب وضع منطق ذي تأثيرات جانبية (كاستدعاءات دوال تُغيّر الحالة) داخل شرط قد يُختصر، إلا إن فهمت العواقب تمامًا:

int counter = 0; // الطرف الأيمن ينفّذ عملية لها تأثير جانبي. boolean result = false && (++counter > 0); System.out.println(counter); // 0 — لم يُزد counter أبدًا!

هذا نادرًا ما تريده. أبقِ الشروط نقيّة — قارن القيم ولا تُعدّل الحالة داخلها.

الخلاصة

تُتيح لك العوامل المنطقية الثلاثة بناء شروط مركّبة ودقيقة. يستلزم && صحّة الطرفين، بينما يكتفي || بصحّة طرف واحد، أما ! فيعكس القيمة. التقييم المختصر يعني أن الطرف الأيمن يُتجاهل حين يكون الناتج معروفًا مسبقًا — استخدم هذا لحماية المراجع الفارغة وحدود المصفوفات، وضع دائمًا الفحص الأأمن أولًا.