Logical Operators

في لغة Dart، تُستخدم العوامل المنطقية (Logical Operators) لدمج أو تعديل الشروط المنطقية (true أو false). تُستخدم هذه العوامل بكثرة مع الشروط (if، while، for) لاتخاذ قرارات معقدة. إليك شرح مفصل مع أمثلة:


العوامل المنطقية الأساسية:

1. && (AND – و)

الشرط: يعيد true فقط إذا كانت كلا الشرطين صحيحين.
مثال:

dart

Copy

bool a = true;
bool b = false;
print(a && b); // الناتج: false (لأن أحدهما false)
print(5 > 3 && "Dart" == "Dart"); // الناتج: true (كلاهما صحيح)

2. || (OR – أو)

الشرط: يعيد true إذا كان أحد الشرطين على الأقل صحيحًا.
مثال:

dart

Copy

bool isRaining = true;
bool hasUmbrella = false;
print(isRaining || hasUmbrella); // الناتج: true (لأن isRaining صحيح)
print(2 < 1 || 5 == 5); // الناتج: true (الشرط الثاني صحيح)

3. ! (NOT – نفي)

الشرط: يعكس قيمة الشرط (true → false والعكس).
مثال:

dart

Copy

bool isLogged = false;
print(!isLogged); // الناتج: true (نفي false)
print(!(10 == 10)); // الناتج: false (نفي true)

أمثلة عملية مع الشروط (if):

مثال 1: التحقق من مدخلات المستخدم

dart

Copy

String username = "admin";
String password = "12345";
if (username == "admin" && password == "12345") {
  print("Login successful!");
} else {
  print("Invalid credentials!");
}
// الناتج: Login successful!

مثال 2: تحديد فئة عمرية

dart

Copy

int age = 25;
bool hasLicense = true;
if (age >= 18 && hasLicense) {
  print("You can drive.");
} else {
  print("You cannot drive.");
}
// الناتج: You can drive.

مثال 3: التحقق من نطاق رقم

dart

Copy

int number = 42;
if (number < 0 || number > 100) {
  print("الرقم خارج النطاق المسموح!");
} else {
  print("الرقم ضمن النطاق.");
}
// الناتج: الرقم ضمن النطاق.

تقييم الدائرة القصيرة (Short-Circuit Evaluation)

  • في &&: إذا كان الشرط الأول false، لا يتم تقييم الشرط الثاني (لأن النتيجة ستكون false مهما كان).
  • في ||: إذا كان الشرط الأول true، لا يتم تقييم الشرط الثاني (لأن النتيجة ستكون true مهما كان).

مثال:

dart

Copy

bool checkCondition() {
  print("تم التنفيذ!");
  return true;
}

print(false && checkCondition()); // الناتج: false ← لا يُنفّذ checkCondition()
print(true || checkCondition()); // الناتج: true ← لا يُنفّذ checkCondition()

الأولوية (Operator Precedence)

  1. ! (NOT) ← أعلى أولوية.
  2. && (AND) ← ثانيًا.
  3. || (OR) ← أقل أولوية.

مثال:

dart

Copy

bool x = true;
bool y = false;
bool z = true;
print(x || y && z); // تُفسّر كـ x || (y && z) → true || (false) → true
print((x || y) && z); // تُفسّر كـ (true) && true → true

ملاحظات مهمة:

  1. النوع (Type) ضروري:
    • العوامل المنطقية تعمل فقط مع قيم من نوع bool.
    • خطأ شائع:dartCopyint number = 5; if (number) { … } // خطأ! يجب أن تكون الشروط منطقية (مثل number > 0).
  2. استخدام الأقواس للوضوح:dartCopyif ((age > 18 && hasLicense) || isParentWithChild) { … }
  3. النفي (!) مع الأقواس:dartCopyprint(!(a && b)); // صحيح: نفي النتيجة الكلية لـ (a && b)

فوائد العوامل المنطقية:

  • تبسيط الشروط المعقدة.
  • تحسين كفاءة الكود عبر التقييم القصير.
  • زيادة قابلية القراءة.