البرمجة التفاعلية في Kotlin: من RxKotlin إلى coroutines
البرمجة التفاعلية هي نموذج يركز على المعالجة غير المتزامنة لتدفقات البيانات ونشر التغييرات. في نظام Kotlin البيئي، يتم تنفيذ هذا المفهوم بطريقتين رئيسيتين: من خلال مكتبة RxKotlin (الإضافات التفاعلية لـ Kotlin المستندة إلى RxJava) ومن خلال آلية coroutines المدمجة مع Flow. في هذه المقالة، سنشرح بالتفصيل كلا النهجين، وخصائصهما وأمثلة استخدامهما.
ما هي البرمجة التفاعلية؟
الفكرة الأساسية للبرمجة التفاعلية هي التعامل مع البيانات كتدفقات مستمرة (streams). بدلاً من طلب البيانات وانتظار الرد، تقوم بالاشتراك في التدفق والتفاعل مع كل حدث جديد. هذا مفيد بشكل خاص لتطبيقات واجهة المستخدم، ومعالجة إدخال المستخدم، وطلبات الشبكة، والعمل مع قواعد البيانات.
مكتبة RxKotlin
RxKotlin هي غلاف فوق RxJava يضيف إضافات ملائمة لـ Kotlin، مثل تعبيرات لامدا، ودوال الإضافة، ودعم أمان القيم الخالية. الأنواع الرئيسية:
Observable<T>- تدفق يمكنه إصدار من 0 إلى N من العناصر والانتهاء بخطأ أو بنجاح.Single<T>- تدفق يصدر عنصرًا واحدًا بالضبط أو خطأ.Flowable<T>- تدفق مع دعم الضغط العكسي (التحكم في سرعة الاستهلاك).Completable- تدفق ينتهي فقط (نجاح/خطأ) بدون بيانات.
مثال RxKotlin
import io.reactivex.rxjava3.core.Observableimport io.reactivex.rxjava3.schedulers.Schedulers
fun main() { val observable = Observable.create<String> { emitter -> emitter.onNext("مرحبًا") emitter.onNext("من") emitter.onNext("RxKotlin") emitter.onComplete() }
observable .subscribeOn(Schedulers.io()) .observeOn(Schedulers.single()) .subscribe( { value -> println("تم الاستلام: $value") }, { error -> println("خطأ: ${error.message}") }, { println("تم إنهاء التدفق") } )
Thread.sleep(1000) // انتظار اكتمال العمليات غير المتزامنة}في هذا المثال، يتم إنشاء Observable يصدر ثلاث سلاسل نصية وينتهي. تدير العوامل subscribeOn و observeOn تدفقات التنفيذ.
Coroutines و Flow في Kotlin
بدءًا من Kotlin 1.3، أصبحت coroutines جزءًا من اللغة، و Flow (التي تم تقديمها في 1.3.70) هي تدفق تفاعلي مدمج بالكامل مع coroutines. المزايا مقارنة بـ RxKotlin:
- تكاليف عامة أقل (coroutines خفيفة الوزن مقابل خيوط Java).
- تكامل طبيعي مع دوال التعليق (suspend functions).
- دعم التزامن المنظم (الإلغاء التلقائي عند إنهاء النطاق).
- بناء جملة أنظف بدون استدعاءات رد.
مثال Flow
import kotlinx.coroutines.*import kotlinx.coroutines.flow.*
fun main() = runBlocking { val flow = flow { for (i in 1..5) { delay(100) // محاكاة عمل غير متزامن emit(i) // إصدار عنصر } }
flow .map { it * it } // تحويل .catch { e -> println("خطأ: $e") } .collect { value -> println("المربع: $value") }}Flow كسول: تبدأ البيانات في التوليد فقط عند استدعاء collect. تعمل العوامل map و filter و flatMapConcat بنفس الطريقة كما في Rx.
مقارنة بين RxKotlin و Flow
| الخاصية | RxKotlin | Flow + coroutines |
|---|---|---|
| التبعيات |