العامل الثلاثي في Kotlin: لماذا لا يوجد وكيف تتجنب الوقوع في المشاكل
\n\nإذا كنت قد أتيت إلى Kotlin من Java أو C# أو JavaScript، فبالتأكيد تساءلت مرة واحدة على الأقل: "أين عامل الثلاثي المفضل لدي شرط ? قيمة1 : قيمة2؟". المفاجأة: لا يوجد في Kotlin. وهذا ليس خطأ، بل ميزة. قرر مطورو اللغة أن العامل الثلاثي التقليدي هو كيان زائد يعقد قراءة الكود فقط، خاصة عندما يكون هناك أكثر من شرطين متداخلين.
لكن غياب العامل الثلاثي ليس مشكلة. يقدم Kotlin بدائل أكثر مرونة وأمانًا. ومع ذلك، يرتكب المبتدئون (وحتى المطورون ذوو الخبرة) نفس الأخطاء في محاولة لمحاكاة البنية المألوفة. في هذه المقالة، سنستعرض أهم 5 أخطاء عند العمل مع التعبيرات الشرطية في Kotlin ونوضح كيفية تجنبها. هيا بنا!
\n\nالخطأ رقم 1: محاولة إدراج العامل الثلاثي مباشرة
\n\nالخطأ الأكثر شيوعًا هو كتابة كود بأسلوب Java:
\n\n// ❌ خطأ: لا يوجد مثل هذا التركيب في Kotlin\nval max = (a > b) ? a : b\n\n\nلن يقوم Kotlin بترجمة هذا الكود ببساطة. ستحصل على خطأ: Unresolved reference: ?. يقع العديد من المطورين في الحيرة ويبدأون في البحث عن مكتبات أو إضافات "تضيف" العامل الثلاثي. لا تفعل هذا!
ما هو الصحيح؟
\n\nفي Kotlin، if ليس عاملًا، بل تعبيرًا. إنه يُرجع قيمة. لذلك بدلاً من العامل الثلاثي، استخدم if-else العادي:
// ✅ الطريقة الصحيحة: if كتعبير\nval max = if (a > b) a else b\n\n\nالكود يُقرأ بشكل أسهل من العامل الثلاثي التقليدي، خاصة إذا كان الشرط معقدًا. تذكر: if في Kotlin يُرجع دائمًا القيمة الأخيرة في كل فرع.
الخطأ رقم 2: نسيان else عند التعيين
\n\nبما أن if هو تعبير، فإنه ملزم بإرجاع قيمة. إذا كتبت:
// ❌ خطأ: لا يوجد else، المترجم لا يعرف ماذا يُرجع\nval result = if (condition) "Yes"\n\n\nسيصدر المترجم خطأ: All branches of 'if' expression are required to return a value. هذا منطقي: ماذا يجب أن يكون في result إذا كان الشرط خاطئًا؟ null؟ سلسلة فارغة؟ المترجم لا يخمن.
ما هو الصحيح؟
\n\nأضف دائمًا else:
// ✅ صحيح: كلا الفرعين يُرجع قيمة\nval result = if (condition) "Yes" else "No"\n\n\nالاستثناء هو إذا كنت تستخدم if كعامل (بدون تعيين). عندها لا يكون else ضروريًا:
// if كعامل - else غير مطلوب\nif (condition) {\n println("Yes")\n}\n\n\nالخطأ رقم 3: استخدام if-else المتداخلة المعقدة بدلاً من when
\n\nعندما يكون لديك أكثر من خيارين، تتحول سلسلة if-else if-else إلى "سباغيتي". انظر إلى هذه الفوضى:
// ❌ سيء: if-else المتداخلة صعبة القراءة\nval status = if (code == 200) "OK"\n else if (code == 404) "Not Found"\n else if (code == 500) "Server Error"\n else "Unknown"\n\n\nالأسطر تقفز، والعيون تتشتت. وإذا أضفت شرطين آخرين - سيكون كابوسًا.
\n\nما هو الصحيح؟
\n\nاستخدم when - وهو مشابه لـ switch ولكن بقدرات محسّنة:
// ✅ ممتاز: when يُقرأ كجدول\nval status = when (code) {\n 200 -> "OK"\n 404 -> "Not Found"\n 500 -> "Server Error"\n else -> "Unknown"\n}\n\n\nwhen في Kotlin هو أيضًا تعبير، لذا يمكنه إرجاع قيمة. وهو أكثر وضوحًا من سلسلة if-else. بالإضافة إلى ذلك، يدعم when شروطًا معقدة: النطاقات، الأنواع، التعبيرات العشوائية.
// when مع نطاق\nval grade = when (score) {\n i