نماذج البرمجة التفاعلية للمشرفين


هذه المقالة مخصصة لمجموعة كبيرة من القراء الذين يرغبون في معرفة ما هي البرمجة التفاعلية. الغرض من هذه المقالة هو تشكيل النماذج العقلية الأساسية للبرمجة التفاعلية (MM RP) دون الخوض في التفاصيل الفنية.

تنصل
( ) — , . , .
, : , . , , .
.

لكن أولاً ، دعنا نشرح ما علاقة النماذج العقلية والرؤساء المذكورة في عنوان المقالة به ...

حول النماذج العقلية
, , , . , .
, , (. [1], [2])
? , , . (), , , . , , «», «» « » .
, , (), , - ().

وهنا الرؤساء ...
. «» «» , : . ( , «» , ).
, «» , , , , , . , . «» «». , , , .
, , , .., () — , , .
, .


لماذا تحتاج البرمجة التفاعلية إلى مشروعك؟


كثير من الناس الذين ليسوا على دراية بـ RP يشككون في البداية به ، ويشتبهون في أن هذه مجرد أزياء فارغة أخرى ، مغطاة ببضع كلمات جميلة. خاصة عندما يعلمون أنه لا يمكنك تقييم RP إلا من خلال تجربته. وتجربته مكلف ، بسبب ارتفاع عتبة الدخول. عشنا وعاشت مع OOP ، ما هو مفقود منها؟
اسمحوا لي أن أعرض وجهة نظري حول هذا الموضوع.
في فجر البرمجة ، عندما تم كتابة معظم البرامج مباشرة بلغة التجميع ، كان مفهوم العمل الرئيسي (عنصر من النموذج العقلي) للمبرمجين هو أمر تعليمي أو أمر لغة. يتم تغذية بعض البيانات (البدائية) لإدخال أمر أو تعليمات. معالجة التعليمات وإصدار بعض بيانات الإخراج. لم يغير ظهور لغات البرمجة الإجرائية الأولى مثل فورتران جوهر المسألة. أصبحت البيانات والعمليات التي تم تنفيذها (كتسلسل من الأوامر الأولية) أكثر تعقيدًا.
بمرور الوقت ، أصبح من الواضح أن هذا المفهوم لا يتفق تمامًا مع حقائق العالم. يمكن أن يكون هناك الكثير من البيانات ، وقد يكون من الصعب تنظيمها. سيكون من الرائع تقسيم البيانات والوظائف المحيطة بها إلى أجزاء ، وتطويرها وصيانتها بشكل منفصل ، واستخدامها معًا.
حل OOP هذه المشاكل بطرق عديدة. وحدة النموذج العقلي لمبرمج OOP النموذجي هي كائن يحتوي على بيانات مخفية (مغلفة) فيه وواجهة وصول إلى هذه البيانات كمجموعة من الوظائف.
لعبت OOP دورًا كبيرًا في أتمتة وحوسبة العديد من عمليات التصنيع وغيرها من العمليات. وإلى جانب ذلك ، تم الكشف عن نقاط ضعفه.
لسوء الحظ ، في OOP لا يوجد مفهوم لعملية على هذا النحو.
حاولوا تحسين الوضع بطرق مختلفة ، مع التركيز على جوانب مختلفة.
وهكذا ، وُلدت البرمجة القائمة على الأحداث [3] وبرمجة تدفق البيانات [4] ومعالجة التدفق [5] والعديد من النماذج الأخرى.
أجرؤ على إثارة سيل من الانتقادات للأتباع والخبراء في هذه النماذج ، محاولين أن ينقلوا بكلمات بسيطة جوهرهم العام.
بطريقة أو بأخرى ، تعمل هذه النماذج مع تدفق المعلومات. في الوقت نفسه ، تركز البرمجة المستندة إلى الأحداث ، كما يوحي الاسم ، على عملية ظهور عناصر تدفق المعلومات ، وبرمجة تدفق البيانات - على التحكم في التدفق (التقسيم والدمج وتحويل التدفقات) ومعالجة التدفق على الاستخدام الأمثل للموارد عند معالجة التدفقات.
البرمجة التفاعلية هي نفس الشيء تقريبًا ، ولكن مع التركيز على العمليات الأولية المحددة لإنشاء وإدارة واستخدام الخيوط. أولئك. يصف RP كيف يتفاعل نظامك (تفاعل اللغة الإنجليزية) مع عناصر تدفق المعلومات. بهذا المعنى ، سيكون من الأصح في روسيا استخدام مصطلح "برمجة الكاشف" (من كلمة "رد فعل") أو "برمجة رد الفعل" (من كلمة "رد فعل على شيء") إذا لم يكن لقص الأذن ، والثاني لم يتسبب في ارتباطات غير صحيحة.
أجرؤ على التعبير عن فكرة مثيرة للفتنة. ما نسميه اليوم في البرمجة التفاعلية باللغة الإنجليزية (البرمجة التفاعلية). دعا ذلك لأسباب تاريخية ويميل لصالح هذا المصطلح رأي الأغلبية.
كان يمكن تسمية هذا النموذج بشكل مختلف. لذلك ، لا تركز على اسمه الحالي ، ولكن حاول فهم جوهره.
وعلى الرغم من أنني سأتحدث عن RP على مستوى تجريدي إلى حد ما ، فسأذكر واجهات برمجة تطبيقات مكتبة RxJS كأمثلة ملموسة.
يشير اختصار RxJS إلى الامتداد التفاعلي لـ JavaScript ، وهو امتداد JavaScript لميزات البرمجة التفاعلية. توجد ملحقات مماثلة للعديد من لغات البرمجة الأخرى ، كما يمكن رؤيته في الصورة أدناه ، مأخوذة من [6].
ملحقات البرمجة التفاعلية

لماذا تحتاج النماذج العقلية لـ RP إلى مشروعك


المشاريع الكبيرة لا تتم بمفردها. يمكنك قراءة أو سماع أن المشاركين في المشروع يجب أن يتحدثوا نفس اللغة. تظهر تجربتي أن هذا بالكاد ضروري وممكن. ولكن ما هو مطلوب هو أن يتم ذكر المفاهيم الأساسية للمشروع وفهمها من قبل المشاركين في المشروع على قدم المساواة قدر الإمكان. فيما يتعلق بالنماذج العقلية (MM) ، يمكننا القول أن MMs ذات المستوى الأعلى يجب أن تكون متشابهة قدر الإمكان.
ولكن كيف يمكن أن تكون متشابهة إذا فكر المحللون فيما يتعلق بحالات سير العمل والاستخدام ، والمهندسين المعماريين في الأنماط ، والمطورين في الوظائف وهياكل البيانات ، والمختبرين في سيناريوهات الاختبار؟
لا أحث جميع هؤلاء المتخصصين على البدء في التفكير في نفس الوقت بفئات البرمجة التفاعلية ، ولكن يمكنني أن أعدهم بأن التعرف على هذه الفئات سيبسط ويزيد من فعالية تواصلهم المهني مع الزملاء. يجب أن يحدث هذا لأنه من ناحية ، تتمتع MM RPs بالقدرة اللازمة لوصف تدفقات العمل المعقدة ، ومن ناحية أخرى ، يمكن تحويل MM RPs مباشرة إلى التعليمات البرمجية في العديد من لغات البرمجة.

المفاجآت ، الأخطار ، أو تلك في RP ليست الطريقة التي اعتدنا عليها جميعًا


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

الاختلاف 1: بدلاً من نموذج المؤشر ، رسم بياني حسابي


سأجرؤ على اقتراح أن العديد من القراء ، عند التفكير في المهمة التالية التي سيتم تحقيقها ، لديهم نموذج عقلي في رؤوسهم ، والذي أسميه نموذج المؤشر. يفترض أن خوارزمية خطوة بخطوة في شكل قائمة خطية من التعليمات سيتم اختراعها لحل المشكلة. يتم تقليل تنفيذ الخوارزمية إلى تنفيذ التعليمات خطوة بخطوة. يمكنك أن تتخيل شيئًا مثل مؤشر إلى التعليمات المنفذة حاليًا. بعد تنفيذ التعليمات ، ينتقل المؤشر (المؤشر) إلى التعليمات التالية في القائمة ويبدأ في التنفيذ.
ضمن هذا النموذج ، تسلسل أوامر مكتوبة بلغة برمجة مشروطة كائنية التوجه
1. 1 = 2
2. 2 = 3 
3. 3 = 1 + 2
4.  1, 2, 3
5. 1 = 4
6.  1, 2, 3

سيعطي النتيجة
2 3 5
4 3 5

نموذجنا العقلي للمؤشر يتنبأ ويشرح مثل هذه النتيجة. بعد معالجة السطر الثالث ، يتم تعيين القيمة X3 ولا يمكن تغيير القيمة الجديدة لـ X1 المحددة في السطر 5.
في عالم RP ، اعتمادًا على تفسير عملية "+" ، ستكون النتيجة على الأرجح هذا
2 3 5
4 3 7

في هذا العالم ، تربط معظم العمليات معلمات الإدخال مع بعضها البعض ، وبالتالي إنشاء الرسوم البيانية الحسابية التي يتم من خلالها دفع الحسابات عند تغيير معلمة واحدة أو أكثر.

الفرق 2: العمليات غير المتزامنة


في إطار نموذج الحسابات العقلية للمؤشر ، لا يمكن أن تبدأ العملية التالية قبل العملية السابقة.
خذ بعين الاعتبار المثال التالي. افترض أن الدالة f1 تحسب الراتب الأساسي بقيمة معرّف المستخدم userId ، وتحسب الوظيفة f2 المكافأة بناءً على معرّف المستخدم وقيمة الراتب.
ثم قد يبدو حساب الراتب الكامل على هذا النحو
1. X = f1(userId)
2. Y = f2(userId, X)
 X, Y

افترض أن الموظف لديه راتب أساسي 10000. ومكافأة 1000 وحدة.
يخبرك نموذجنا العقلي للمؤشر بما يجب طباعته.
10000 1000 

للأسف ، في عالم RP غير المتزامن ، قد تكون النتيجة ، اعتمادًا على مدة العمليات
0 0 
10000 0 
0 1000 
10000 1000 

(أنا لا أعتبر استثناءات بعد).
الشيء هو أنه في عالم رد الفعل غير المتزامن ، لا تنتظر العملية التالية حتى نهاية العملية السابقة ، إذا كانت العملية السابقة) غير متزامنة.
لتوضيح هذا ، دعنا نلقي نظرة على بعض التفاصيل المهمة باستخدام المثال الواقعي الموضح في الشكل أدناه.
تظهر الصورة وقت التنفيذ لأربعة تعليمات L1 و L2 و L3 و L4 مستقلة عن بعضها البعض (أرقامهم مهمة بالنسبة لنا ، وليس الإملاء) في أوضاع متزامنة (الجزء العلوي من الصورة) وغير متزامن (الجزء السفلي من الصورة).

كما نرى ، في الحالة الأولى ، "كل" تعليمات لاحقة "تنتظر" نهاية الأمر السابق. في الحالة غير المتزامنة ، يبدأ تنفيذ جميع التعليمات في وقت واحد. نظرًا للتنفيذ المتوازي واستخدام الموارد ، يتم تشغيل معظم الإرشادات في الوضع غير المتزامن لفترة أطول من الوضع المتزامن. ومع ذلك ، سوف يتركون عملهم معًا في وقت سابق.
يختلف أيضًا ترتيب إكمال التعليمات في كلا الوضعين. متزامنة:
L1, L2, L3, l4
ولكن بشكل غير متزامن:
L3, L2, L1, L4
.

الفرق 3: سلاسل غير مكتملة (بدون المستهلك) لا تعمل على الإطلاق


في العديد من لغات البرمجة التقليدية ، من الشائع ربط استدعاءات الوظائف أو خصائص الكائن بالنقاط.
على سبيل المثال ، تحول سلسلة استدعاء دالة JavaScript التالية كلمة "good" إلى "dog":
„good“.split(„“).reverse().join(„“).replace(„oo“, „o“);

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

لماذا كل هذا؟


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

أريد أن أؤكد لك أن معرفتك بالبرمجة التقليدية و MM المؤشر لا يجب أن يتم طرحها في سلة المهملات بسبب ظهور RP. تركتها البرمجة التفاعلية بمفردها ووسعتها باستخدام عمليات جديدة على أنواع جديدة من الكائنات. كيف - سنتحدث عن هذا لاحقًا.

فضاء برمجة النماذج العقلية ومكان MM RP فيها


بالحديث عن مكان RP في المشهد العام للبرمجة ، غالبًا ما يذكر المؤلفون بعدين - تعقيد الكائنات المعالجة وتزامن / تزامن العمليات. يمكن العثور على مثال لمثل هذا التصنيف في كتاب "RxJS في العمل" [7] ، في الفصل "متى وأين يتم استخدام RxJS".
في هذا التصنيف ، ينقسم بُعد الأشياء إلى كائنات مفردة وكائنات متعددة: المصفوفات والقوائم وما إلى ذلك. تنقسم العمليات إلى متزامن وغير متزامن.
وهكذا ، يقسم هذا التصنيف عالم البرمجة إلى أربعة مجالات. RP هي واحدة من هذه المناطق المسؤولة عن معالجة كائنات متعددة مع عمليات غير متزامنة.
أجد هذا التصنيف مثيرًا للاهتمام للغاية ، لكني أود أن أنظر إليه من وجهة نظر النماذج العقلية. يعرض الجدول أدناه لهم.
القيم والأشياء الفردية, ,
, (Stream)
, (Promise)(Workflow)

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

ما هو الامتداد؟


توسيع تيارات بالمقارنة مع التوقعات هو أن المعلومات المتوقعة لا يمكن أن تصل مرة واحدة ، ولكن في أجزاء كثيرة. في هذه الحالة ، قد تنتهي العملية بدون انتهاء. أولئك. بعد سلسلة من الحصص الناجحة ، سوف نتلقى إشعارًا بالخطأ. بالإضافة إلى ذلك ، تمت إضافة نسخة أخرى من المعلومات - إشعار بنهاية العملية.
هذا يعني ، على سبيل المثال ، أنه من الممكن تلقي عدة أجزاء (ولكن ليس كلها) من المعلومات المتوقعة و (بدون رسالة خطأ) رسالة حول نهاية المعالجة.
تذكر مرة أخرى ، مع Waiting ، لدينا خياران بديلان فقط للمعلومات الناتجة.
يعتبر Mental Jet Model مناسبًا تمامًا لفهم ومناقشة وتنفيذ عملية تحويل تسلسل من الكائنات من نفس النوع. يوسع MM Stream ذلك بالجوانب التالية:
  • يمكن أن يكون هناك العديد من الطائرات ويمكن دمجها معًا
  • قد تكون الطائرات غير متجانسة
  • يمكننا تقسيم الطائرات إلى طائرات جديدة وفقًا لمعايير مختلفة
  • يمكننا "إغلاق" و / أو تحويلها إلى أخرى جديدة في إطار دفق واحد.

لذا ، حددنا مكان MM RP (تيارات) في الفضاء أو المناظر الطبيعية لكائنات البرمجة. دعونا الآن نخفض نظرة عين الطائر ونلقي نظرة فاحصة على Streams ونماذجها العقلية.

تيارات ومراحل دورة حياتها


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

  1. كل موضوع ينشأ بطريقة أو بأخرى
  2. إنه يتحرك بطريقة ما نحو المستهلك.
  3. يحدث شيء في الطريق معه (يتحول)
  4. يمكن تقسيمها إلى عدة تيارات أو دمجها مع تيارات أخرى
  5. يستخدم المستهلك بطريقة أو بأخرى التدفق ، وتوقف عن الوجود.

الجوانب المدرجة هي مراحل في وقت واحد من دورة حياة العناصر الفردية للتدفق.
دعونا ننظر فيها بمزيد من التفصيل باستخدام مثال وظائف RxJS.

إنشاء الموضوع


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

حركة المستهلك وتحول التدفق


يمكن تنفيذ عمليات تحويل التدفق في الطريق إلى المستهلك ومن قبل نفسه. في كلتا الحالتين ، تكون عمليات معالجة عناصر التدفق متسلسلة تمامًا ، أي لا تبدأ العملية التالية بصرامة إلا بعد اكتمال العملية السابقة وتمرير نتائجه إليها.
على عكس Stream ، والتي في بعض لغات البرمجة هي تراكيب لغوية مع بناء الجملة الخاصة بها ودلالاتها ، فإن الإضافات التفاعلية مثل RxJS في JavaScript تضطر إلى استخدام بناء الجملة والمعاني الأساسية للغة القابلة للامتداد. لذلك ، تطبق RxJs وظيفة الأنابيب () ، التي يمكنك من خلالها إجراء المكالمات للوظائف - معالجات الدفق نفسه وعناصره الفردية.
من المهم أن نلاحظ أن الوظائف الخاصة التي يمكن توجيهها فقط هي التي يمكن أن تكون معالجات التدفق.

"التدفق على ثلاث مراحل"


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

تقسيم ودمج التدفقات


يتم تقسيم التدفقات على مرحلتين. في المرحلة الأولى ، تبدأ خيوط فارغة. بعد ذلك ، في المرحلة الثانية (مرحلة معالجة التدفق) ، في إحدى وظائف المعالجة ، سيتم تحليل العناصر وإعادة توجيهها إلى التدفق المطلوب. من الناحية الفنية ، هناك العديد من الخيارات لكيفية القيام بذلك. على سبيل المثال ، إزالته من الخيط الحالي أو استنساخه قبل تشغيله في خيط جديد.
يمكنك دمج تدفقات متعددة في واحد في عدد كبير بشكل مدهش من الطرق.
إن أبسط الطرق التي تتبادر إلى الذهن هي دمجها في ترتيب الاستلام ، أو أولاً من الدفق الأول ثم الكل من الثاني.
تسمح الطريقة الموضحة أدناه في الصورة لأحد التدفقين بتكوين واحد يحتوي على أزواج مرتبة من الكائنات من التدفقين الأول والثاني. في هذه الحالة ، يتم تكوين زوج جديد إذا ظهر عنصر جديد في أحد التدفقات. يحتوي A على زوج من العناصر الأخيرة بدقة لكل دفق. هذا يؤدي إلى حقيقة أنه يمكن تضمين نفس العنصر في عدة أزواج.
تسمى الرموز الرسومية المستخدمة في هذا المثال الرسوم البيانية للرخام وهي فعالة جدًا في شرح دلالات تقسيم وتكامل التدفقات.
إذا كان هذا الموضوع يهمك ، أنصحك بدراسة العمليات والرسوم البيانية الرخامية الخاصة بها على المصدر [8].


باستخدام الجداول


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

سحر تيارات خطيرة


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

لخص


حاولت في هذه المقالة أن أخبركم عن النماذج العقلية للبرمجة التفاعلية (MM RP) وحتى وضعها جزئياً في وعيكم. دعونا نكرر النقاط الرئيسية مرة أخرى.

  1. MM RP خاصة ، ولا تشبه النماذج العقلية للبرمجة التقليدية.
  2. عند الشروع في البرمجة التفاعلية ، يجب أن نتذكر أن بعض العناصر الراسخة في مناطق أخرى من MM مثل المؤشر أو سلاسل الاتصال أو الحلقات لا تعمل ، أو أنها لا تعمل بهذه الطريقة.
  3. النموذج العقلي الرئيسي لـ RP هو "دفق ثلاثي القنوات" مع قناة للعناصر "العادية" والأخطاء والمعلومات حول نهاية الدفق.
  4. يمكن أن تكون الجداول محدودة ولا نهائية.
  5. «», «» «» . «» «».
  6. . (, ). .
  7. , .
  8. , .
  9. . .
  10. , «».


إذا كنت مهتمًا بهذا الموضوع ، يمكنك "اللعب" مع التدفقات باستخدام أجهزة المحاكاة المتاحة على الموقع [8].
إذا كنت تريد أن تفهم بشكل أفضل مفاهيم RP ، أوصي بأن تعمل من خلال الكتاب [7] ، وبالطبع ، تعرف على البيان التفاعلي [11].
ستصل إلى المستوى التالي في تشكيل MM RP الخاص بك من خلال العمل من خلال الكتب [9] و [10] على تصميم ونمذجة الأنظمة التفاعلية.

الأدب والمراجع


  1. البرمجة هي تجسيد الأفكار. (مقال عن Habr . Habr.com/ru/post/425321 )
  2. Sirotin V. RPSE: Reification كنموذج لهندسة البرمجيات. arxiv.org/abs/1810.01904
  3. برمجة مدفوعة بالحدث. en.m.wikipedia.org/wiki/Event-driven_programming
  4. Dataflow-programming. en.m.wikipedia.org/wiki/Dataflow_programming
  5. Stream-processing. en.m.wikipedia.org/wiki/Stream_processing
  6. Rx-Extensions: reactivex.io/languages.html
  7. RxJS in Action. – 4. August 2017. Paul P. Daniels (Autor), Luis Atencio. Manning Publications. ISBN-13: 978-1617293412
  8. RxJS online Documentstion. xgrommx.imtqy.com/rx-book/index.html
  9. Reactive Design Patterns. 2017. Roland Kuhn Dr., Brian Hanafee, Jamie Allen. Manning Publications. ISBN-13: 978-1617291807
  10. Functional and Reactive Domain Modeling. 2016. Debasish Ghosh.Manning Publications. ISBN-13: 978-1617292248
  11. The Reactive Manifesto www.reactivemanifesto.org


: geralt

Source: https://habr.com/ru/post/undefined/


All Articles