عدة متغيرات في let في Kotlin: 3 طرق أنيقة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

عدة متغيرات في let: مشكلة لم تكن تلاحظها



هل سبق لك أن كتبت كودًا بلغة Kotlin وفجأة أدركت: "أحتاج إلى معالجة متغيرين قابلين للصفر في نفس الوقت"؟ تتجه إلى دالة let المفضلة لديك... ولكن توقف. let تعمل فقط مع متغير واحد. ولكن ماذا لو كان لديك اثنان أو ثلاثة أو أكثر؟



هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow حول Kotlin. آلاف المطورين يتعثرون في هذه المهمة التي تبدو بسيطة. واليوم سنفهم مرة واحدة وإلى الأبد كيفية حلها بشكل أنيق وصحيح.



في هذه المقالة، لن نقدم مجرد أمثلة جافة. سنقارن بين 3 طرق، ونناقش إيجابياتها وسلبياتها وأفضل الممارسات. ستعرف أي طريقة تختار حسب الموقف، وستتوقف عن كتابة دوال let المتداخلة القبيحة.



لماذا مشكلة "متغيرات متعددة في let" شائعة جدًا؟



Kotlin هي لغة تعشق أمان الصفر (null safety). دوال النطاق (scope functions) — let، run، with، apply، also — هي سلاحنا السري للعمل بأمان مع الأنواع القابلة للصفر. ولكن لديها قيود: كل دالة مصممة لكائن مستقبل واحد.



تخيل موقفًا: تحصل من API على حقلين قابلين للصفر — اسم المستخدم وبريده الإلكتروني. تحتاج إلى التحقق من أن كلاهما ليسا فارغين، ثم تنفيذ إجراء (مثل إرسال بريد ترحيبي).



غالبًا ما يكتب المبتدئون بهذه الطريقة:



val name: String? = getUserName()val email: String? = getUserEmail()

if (name != null && email != null) { sendWelcomeEmail(name, email)}


هذا يعمل، لكنه ليس بطريقة Kotlin. يمكننا جعل الكود أكثر إيجازًا وأمانًا. دعنا نرى كيف.



الطريقة 1: let المتداخلة — بسيطة ولكنها قبيحة



الطريقة الأكثر وضوحًا هي تداخل دالة let داخل أخرى. هذا أول ما يتبادر إلى الذهن:



val name: String? = getUserName()val email: String? = getUserEmail()

name?.let { safeName -> email?.let { safeEmail -> sendWelcomeEmail(safeName, safeEmail) }}


الإيجابيات:

  • تعمل "مباشرة" دون الحاجة إلى دوال إضافية
  • الكود يُقرأ بشكل تسلسلي


السلبيات:

  • عند زيادة عدد المتغيرات (3، 4 أو أكثر)، يتحول الكود إلى "هرم الرعب"
  • صعب القراءة والصيانة
  • كل مستوى تداخل يضيف مسافة بادئة إضافية


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



الطريقة 2: استخدام Pair و Triple و data class



توفر Kotlin فئات مدمجة Pair و Triple. الفكرة هي دمج المتغيرات القابلة للصفر في كائن واحد، ثم التحقق منه عبر let.



val name: String? = getUserName()val email: String? = getUserEmail()

val pair = name?.let { n -> email?.let { e -> n to e }}

pair?.let { (safeName, safeEmail) -> sendWelcomeEmail(safeName, safeEmail)}


لثلاثة متغيرات نستخدم Triple:



val name: String? = getUserName()val email: String? = getUserEmail()val age: Int? = getUserAge()

val triple = name?.let { n -> email?.let { e -> age?.let { a -> Triple(n, e, a) } }}

triple?.let { (safeName, safeEmail, safeAge) -> sendWelcomeEmail(safeName, safeEmail, safeAge)}


الإيجابيات:

  • لا يوجد تداخل عميق في الاستدعاء النهائي
  • التفكيك (Destructuring) يجعل الكود نظيفًا


السلبيات:

  • التداخل الداخلي (عند إنشاء Pair/Triple) لا يزال موجودًا
  • Triple هو الحد الأقصى للمكتبة القياسية. لأربعة متغيرات أو أكثر، تحتاج إلى

المدونات

توصيات الكتب