ReactiveX

ReactiveX ( Rx ، والمعروفة أيضًا باسم Reactive Extensions ) هي مكتبة برمجية طورتها مايكروسوفت ، تُمكّن لغات البرمجة الإجرائية من التعامل مع سلاسل البيانات، سواءً كانت متزامنة أم غير متزامنة . توفر هذه المكتبة مجموعة من عوامل التشغيل التي تُطبّق على كل عنصر في السلسلة. وهي تطبيق للبرمجة التفاعلية ، وتُقدّم مخططًا أساسيًا للأدوات التي يُمكن تنفيذها في لغات برمجة متعددة .

ملخص

ReactiveX هي واجهة برمجة تطبيقات للبرمجة غير المتزامنة مع تدفقات قابلة للمراقبة. [ 1 ]

تتيح البرمجة غير المتزامنة للمبرمجين استدعاء الدوال، ثم تقوم هذه الدوال بـ"إعادة الاتصال" عند انتهائها، وذلك عادةً عن طريق إعطاء الدالة عنوان دالة أخرى لتنفيذها عند الانتهاء. غالبًا ما تتجنب البرامج المصممة بهذه الطريقة عبء تشغيل وإيقاف العديد من الخيوط بشكل متكرر.

تُشبه التدفقات القابلة للمراقبة (أي التدفقات التي يمكن مراقبتها) في سياق Reactive Extensions مُصدري الأحداث، حيث تُصدر ثلاثة أحداث: التالي، والخطأ، والاكتمال. يُصدر التدفق القابل للمراقبة أحداث "التالي" حتى يُصدر حدث خطأ أو حدث اكتمال. وعندها، لن يُصدر أي أحداث أخرى إلا إذا تم الاشتراك فيه مرة أخرى.

تستخدم الأمثلة أدناه تطبيق RxJS للامتدادات التفاعلية للغة برمجة JavaScript.

تحفيز

بالنسبة لتسلسلات البيانات، يجمع هذا الأسلوب بين مزايا المُكرِّرات ومرونة البرمجة غير المتزامنة القائمة على الأحداث. كما أنه يعمل كوعد بسيط، مما يُزيل التعقيدات الناتجة عن طبقات متعددة من الاستدعاءات.

الملاحظات والمراقبون

ReactiveX عبارة عن مزيج من الأفكار المستوحاة من أنماط المراقب والمكرر ومن البرمجة الوظيفية . [ 2 ]

يشترك المراقب في تسلسل قابل للمراقبة. ثم يرسل التسلسل العناصر إلى المراقب واحدًا تلو الآخر، عادةً عن طريق استدعاء دالة رد الاتصال المُقدمة. يتعامل المراقب مع كل عنصر قبل معالجة العنصر التالي. إذا وردت أحداث كثيرة بشكل غير متزامن، فيجب تخزينها في قائمة انتظار أو تجاهلها. في ReactiveX، لن يتم استدعاء المراقب أبدًا بعنصر خارج الترتيب، أو (في سياق متعدد الخيوط) قبل أن تُعيد دالة رد الاتصال قيمة العنصر السابق. تبقى الاستدعاءات غير المتزامنة غير متزامنة، ويمكن التعامل معها عن طريق إرجاع كائن قابل للمراقبة.

يشبه هذا النمط نمط المُكرِّرات، ففي حال حدوث خطأ فادح، يُبلغ المُراقب بشكل منفصل (عن طريق استدعاء دالة ثانية). وعند إرسال جميع العناصر، يكتمل (ويُبلغ المُراقب عن طريق استدعاء دالة ثالثة). كما تستعير واجهة برمجة تطبيقات Reactive Extensions العديد من عواملها من عوامل المُكرِّرات في لغات برمجة أخرى.

تختلف الامتدادات التفاعلية عن البرمجة التفاعلية الوظيفية كما هو موضح في مقدمة الامتدادات التفاعلية:

يُطلق عليها أحيانًا اسم "البرمجة التفاعلية الوظيفية"، لكن هذا المصطلح غير دقيق. قد تكون ReactiveX وظيفية، وقد تكون تفاعلية، لكن "البرمجة التفاعلية الوظيفية" تختلف عنها تمامًا. أحد الفروق الرئيسية هو أن البرمجة التفاعلية الوظيفية تعمل على قيم تتغير باستمرار مع مرور الوقت، بينما تعمل ReactiveX على قيم منفصلة تُصدر على مدار الوقت. (للحصول على معلومات أكثر دقة حول البرمجة التفاعلية الوظيفية، يُرجى مراجعة أعمال كونال إليوت). [ 2 ]

المؤثرات التفاعلية

المعامل هو دالة تأخذ كائنًا قابلًا للملاحظة (المصدر) كمعامل أول، وتعيد كائنًا قابلًا للملاحظة آخر (الوجهة، أو الكائن الخارجي). ثم، لكل عنصر يصدره الكائن المصدر، تُطبق الدالة عليه، ثم تُصدره على الكائن الوجهة. بل يمكنها أيضًا إصدار كائن آخر على الكائن الوجهة. يُسمى هذا الكائن بالكائن الداخلي.

يمكن أن يتبع عاملٌ يُصدر متغيرات داخلية عاملٌ آخر يجمع بطريقةٍ ما العناصر الصادرة عن جميع المتغيرات الداخلية ويُصدر العنصر على متغيره الخارجي. ومن الأمثلة على ذلك:

  • switchAll– يشترك في كل عنصر داخلي قابل للملاحظة جديد بمجرد إصداره، ويلغي اشتراكه في العنصر السابق.
  • mergeAll– يشترك في جميع المتغيرات الداخلية القابلة للملاحظة عند إصدارها ويخرج قيمها بأي ترتيب يستقبلها به.
  • concatAll- يشترك في كل عنصر قابل للملاحظة داخليًا بالترتيب وينتظر اكتماله قبل الاشتراك في العنصر القابل للملاحظة التالي.

يمكن ربط عوامل التشغيل معًا لإنشاء تدفقات بيانات معقدة تقوم بتصفية الأحداث بناءً على معايير محددة. ويمكن تطبيق عوامل تشغيل متعددة على نفس العنصر القابل للملاحظة.

قد تكون بعض العمليات التي يمكن استخدامها في Reactive Extensions مألوفة للمبرمجين الذين يستخدمون لغات البرمجة الوظيفية، مثل map وreduce وgroup وzip. [ 3 ] تتوفر العديد من العمليات الأخرى في Reactive Extensions، على الرغم من أن العمليات المتاحة في تطبيق معين للغة برمجة معينة قد تختلف.

أمثلة على عوامل التشغيل التفاعلية

إليك مثال على استخدام عاملي map و reduce. نقوم بإنشاء كائن قابل للملاحظة من قائمة أرقام. يقوم عامل map بضرب كل رقم في اثنين وإرجاع كائن قابل للملاحظة. ثم يقوم عامل reduce بجمع جميع الأرقام المُدخلة إليه (القيمة 0 هي نقطة البداية). استدعاء دالة subscribe يُسجل مُراقبًا يراقب القيم من الكائن القابل للملاحظة الناتج عن سلسلة العوامل. باستخدام دالة subscribe، يُمكننا تمرير دالة لمعالجة الأخطاء، تُستدعى عند حدوث خطأ في الكائن القابل للملاحظة، ودالة إكمال عند انتهاء الكائن القابل للملاحظة من إرسال العناصر.

import { of , Observable , map , reduce } from 'rxjs' ;const source : Observable <number> = of ( 1 , 2 , 3 , 4 , 5 ) ; source.pipe ( map ( ( value ) => value * 2 ) , reduce (( sum , value ) = > sum + value , 0 ) ) . subscribe ({ next : ( value ) => { console.log ( value ); }, error : ( error ) => { console.error ( error ) ; }, complete : ( ) => { console.log ( ' done ' ) ; } , } );

الاستخدام في البرمجة الموجهة بالتدفق

تتيح بعض العناصر الأساسية في RxJS BehaviorSubjectإمكانية إنشاء تدفقات ذات حالة نقية لتتبع حالة التطبيق ذات التعقيد التعسفي بعبارات بسيطة.

سيقوم الزر أدناه بإرسال حدث إلى البث، والذي بدوره سيعيد إرسال الرقم الطبيعي التالي في كل مرة، إلى العلامة التي تليها ويعرض عدد النقرات التي تم اكتشافها.<span>

تتيح مكتبات مثل Rimmel.js ، المصممة حول RxJS Observables، التكامل بين التدفقات التفاعلية ونموذج كائن المستند (DOM) الخاص بـ HTML:

import { BehaviorSubject , scan } from 'rxjs' ; import { rml } from 'rimmel' ;const count = new BehaviorSubject ( 0 ). pipe ( scan ( x => x + 1 ) );document.body.innerHTML = rml `  <buttonsi" id="mwATA">${ counter } " >انقر</ button > <p>  العدد هو: <span> ${ count } </span></p> ` ;

تاريخ

تم تطوير Reactive Extensions بواسطة فريق برمجة الحوسبة السحابية في مايكروسوفت حوالي عام 2011، كمنتج ثانوي لمشروع أوسع يُدعى Volta. كان الهدف الأصلي منها توفير تجريد للأحداث عبر مختلف طبقات التطبيق لدعم تقسيم الطبقات في Volta. يُمثل شعار المشروع ثعبان البحر الكهربائي، في إشارة إلى Volta. أما لاحقة "extensions" في الاسم فهي إشارة إلى تقنية Parallel Extensions التي طُوّرت في نفس الفترة تقريبًا؛ ويُعتبر المشروعان متكاملين.

كان التطبيق الأولي لـ Rx مخصصًا لإطار عمل .NET ، وقد صدر في 21 يونيو 2011. لاحقًا، بدأ الفريق بتطوير Rx لمنصات أخرى، بما في ذلك JavaScript و C++ . أُتيحت التقنية كمصدر مفتوح في أواخر عام 2012، بدايةً على CodePlex . ثم نُقل الكود إلى GitHub ، وتمت ترجمته إلى عدة لغات برمجة أخرى، منها Go وJava وKotlin وPHP وRust.

انظر أيضاً

مراجع

  1. "ReactiveX" . reactivex.io . تم ​​الاطلاع عليه بتاريخ 2020-02-20 .
  2. 1 2 "ReactiveX - مقدمة" . ReactiveX.io . تم ​​الاطلاع عليه بتاريخ 23 سبتمبر 2018 .
  3. "ReactiveX - Operators" . ReactiveX.io . تم ​​الاطلاع عليه بتاريخ 23 سبتمبر 2018 .
  • ReactiveX ، موقع إلكتروني للإضافات التفاعلية يحتوي على وثائق وقائمة بالتطبيقات
  • ReactiveX على GitHub