غالباً ما نجد، عند الخوض في عالم تطوير Kotlin، أن الشيفرة القديمة تُشكّل صداعاً حقيقياً. لا يزال الكثير منا يستخدم مكتبات أو واجهات برمجة تطبيقات قديمة تعتمد على نظام... الاسترجاعاتتلك الآلية التي تُخبر فيها دالة ما، "عندما تنتهين من هذا، اتصلي بي". تكمن المشكلة في أنه إذا كان لديك عدد كبير جدًا من دوال الاستدعاء المتداخلة، فإنك ستقع في فخ... جحيم المكالمات المتكررةحيث يبدو الكود وكأنه سلم لا نهائي، وتصبح قراءته مهمة شاقة للغاية.
لحل هذه المشكلة، توفر لغة Kotlin خاصية الكوروتينات، التي تسمح بكتابة التعليمات البرمجية غير المتزامنة كما لو كانت متسلسلة. مع ذلك، لم تكن جميع المكتبات الحديثة تدعمها منذ البداية. وظائف التعليقوهنا تبرز أداة أساسية تسمى تعليق الروتين الفرعي القابل للإلغاءوالتي تعمل كجسر سحري لتحويل تلك الاستدعاءات القديمة إلى وظائف تعليق حديثة، مما يسمح لنا بإدارة تدفق البيانات بطريقة أنظف وأكثر كفاءة.
ما هو بالضبط suspendCancellableCoroutine؟
باختصار، إنها وظيفة منخفضة المستوى تسمح لنا إيقاف التنفيذ مؤقتًا من روتين فرعي حتى يتحقق شرط خارجي. على عكس الخيارات الأخرى، فإن هذا الإصدار "قابل للإلغاء"، مما يعني أنه إذا تم إلغاء الروتين الفرعي الذي استدعى الدالة، فيمكننا موارد التنظيف أو إيقاف الاستدعاء لتجنب تسرب الذاكرة، وهو أمر حيوي في تطبيقات أندرويد حيث تكون دورة حياة المكون متقلبة للغاية.
عند استدعاء هذه الدالة، نحصل على كائن يسمى continuationهذا الشيء هو الذي يمتلك القدرة على استئناف الروتين بمجرد أن تُعيد دالة الاستدعاء القديمة النتيجة، نخبر البرنامج: "ابقَ هنا في انتظار الرد، وعندما تستجيب دالة الاستدعاء، استخدم هذا الاستمرار للمضي قدمًا."
خطوات إجراء عملية الترحيل
لتحويل طريقة تعتمد على رد الاتصال إلى دالة تعليق، فإن النهج الأمثل هو إنشاء دالة التمديدوبهذه الطريقة، لا نغير الكود الأصلي للمكتبة، بل نضيف وظائف إضافية أكثر ملاءمة للاستخدام في حياتنا اليومية.
- أولاً، نقوم بتغليف استدعاء الطريقة القديمة داخل كتلة من تعليق الروتين الفرعي القابل للإلغاء.
- ضمن هذا الجزء، نقوم بتكوين المستمعين أو ردود الاتصال الخاصة بواجهة برمجة التطبيقات القديمة.
- عندما تنجح عملية الاستدعاء، نقوم باستدعاء
continuation.resume(valor)لإعادة البيانات إلى التدفق الرئيسي. - في حالة حدوث خطأ، نستخدم
continuation.resumeWithException(excepción)لإثارة الخطأ حتى نتمكن من التقاطه باستخدام كتلة try-catch.
من النقاط الحاسمة التي يجب ألا نغفلها إدارة الإلغاءات. من خلال هذه الطريقة invokeOnCancellationيمكننا تحديد ما يجب أن يحدث في حالة مقاطعة الروتين الفرعي. على سبيل المثال، إذا كنا نقوم بـ طلب الشبكةيمكننا إلغاء طلب HTTP لتجنب إهدار البيانات أو بطارية الجهاز.
المزايا الحقيقية لهذا النهج
تتمثل الفائدة الأكثر وضوحًا في أن الكود يصبح أكثر وضوحاانتقلنا من استخدام منطق موزع على عدة دوال مجهولة إلى استخدام تدفق خطي. هذا لا يُسهّل قراءة الكود فحسب، بل يُقلّل بشكل كبير من احتمالية حدوث أخطاء عند التعامل مع حالات التحميل أو الأخطاء.
علاوة على ذلك، من خلال دمج هذا مع التزامن المنظملدينا سيطرة كاملة على دورة حياة المهمة. إذا غادر المستخدم شاشةً ما، يتم إلغاء الروتين الفرعي، ولأننا نستخدم النسخة القابلة للإلغاء، يتوقف تنفيذ الاستدعاء القديم أيضًا، مما يمنع التطبيق من محاولة تحديث واجهة لم تعد موجودة، وبالتالي يمنع حدوث الأخطاء. حوادث تحطم غير متوقعة.
يُمكّن الانتقال من النماذج التفاعلية أو القائمة على الأحداث إلى نموذج التعليق المطور من التركيز على منطق الأعمال وليس في تعقيد البنية التحتية غير المتزامنة، مما يجعل صيانة البرامج أبسط بكثير على المدى الطويل. شارك هذه المعلومات وسيتعرف المستخدمون الآخرون على الموضوع.