يحتوي المنشور على قدر معين من المزاح ، وتطلب وزارة الصحة بشكل مقنع من قارئ غير مستعجل الامتناع عن القراءة.تشبه المقالات التي تتناول موضوع "AF أفضل" أو "OOP is better" نقاشًا حول الأفضل لتناول الغداء أو الشوكة أو الملعقة. تقليديا ، بدأت junes بملعقة ، لكن شخصًا موثوقًا جدًا أخبرني ذات مرة أنه يأكل اللحم فقط ويستخدم الشوكة ، لذلك ولدت طريقة جديدة - أكل الشوكة. يأكلون العصيدة والحساء ، وحتى يتمكنوا من لف العصائر. تمتلئ الإنترنت بمقالات ، وكم هي جيدة ، التي تعلمناها لتناول عصير مع شوكة والتغلب على جميع الخليعون. هذا أمر مضحك وحزين على حد سواء ، فهو يوفر ميزة تنافسية للاعبين ذوي الخبرة الذين يظهرون نتائج فائقة ببساطة يتجاهلون هذه الضجة ، من ناحية أخرى ، عليهم إعادة تدريب الزملاء والموظفين ، وتنظيف القمامة التي تسببها الرياح من رؤوسهم. سأحاول في هذه المقالة أن أخبر رؤيتي التي لا تدعي أنها حقيقة مطلقة ، لكنها تعمل جيدًا في الممارسة العملية
كما هي العادة في العلم ، نبدأ بالتعريفات. يتضمن التعريف الكلاسيكي لـ OOP اتباع مبادئ الميراث والتغليف وتعدد الأشكال. ولكن إذا لم يكن لدينا أحد هذه المكونات ، فهل سيكون OOP؟ وإذا لم يكن كذلك ، ماذا سيكون؟
بينما كان الجزء الممل من الجمهور يحوم حول هذا غير عملي ولم يقدم لنا أي سؤال ، دعونا نتذكر ما حدث قبل منظمة التحرير الفلسطينية . وقبله كان البرمجة الإجرائية. وكانت الفكرة الرئيسية ل OOP في ذلك الوقت في
اتصال البيانات والوظائف لمعالجتها . الفكرة بسيطة ، ولكنها ثورية تمامًا ، من الصعب تخيل مقدارها ، ولكن المزيد عن ذلك لاحقًا.
البرمجة الوظيفية ، في تفسير حر ، تعتبر
البرنامج بمثابة صيغة رياضية . تتم صياغة الصيغ بشكل جيد وبنفس المدخلات تُرجع نفس المخرجات. يتكون البرنامج بأكمله من إجراءات تتبع نفس المبادئ. كيف يختلف هذا عن نفس البرمجة الإجرائية؟ يستخدم FP بنشاط
وظائف نقية ؛ من الناحية المثالية ، يجب أن يكون البرنامج بأكمله وظيفة نقية.
ليس للوظائف البحتة
آثار جانبية ، يمكن تحفيظها بسهولة ، واختبارها بسهولة ، وما إلى ذلك ... يمكننا أن نقول أنه في الوظائف البحتة تكون الفكرة والمزايا الرئيسية لـ FP.
والآن سؤالان:
- هل يمكننا استخدام وظائف نقية في OOP؟
- هل يمكننا ربط وظائف البيانات في FP؟
الجواب على كلاهما هو نعم. يمكن أن تكون أساليب الفصل الثابت نقيًا ، وحتى يمكن اعتبار أساليب المثيل نظيفة إذا لم تنشئ آثارًا جانبية ونعتبر أن خصائص مثيل الفئة معلمات. حدود التعريفات الكلاسيكية مبالغ فيها وقد يختلف بعضها ، لكن في الممارسة العملية ، تعمل فقط. ويتم إضفاء الطابع الرسمي على هذه الأساليب واختبارها ليس أسوأ من الوظائف النقية الكلاسيكية المكتوبة وفقًا لجميع الشرائع. حول طرق ربط البيانات أكثر تعقيدًا قليلاً ، تفرض اللغة والمكتبات قيودًا. دعنا نقول في جافا سكريبت أن هذا يتم بشكل أساسي ، لست متأكداً من هاسكل وإرلانج. الآن الشيء الأكثر إثارة للاهتمام هو ما يقدمه ، ولماذا أثارت OOP بالفعل مثل هذه الضجة منذ 20-30 سنة. إذا كنت تكتب برنامجًا صغيرًا - يمكنك الكتابة كما تريد ، باستثناء ما تشعر به من جمال ، فهو لا يؤثر على أي شيء. عند إنشاء برنامج كبير حقًا ، تنشأ مشكلة التعقيد. ليس من التعقيد الحسابي ، نعتقد أننا هنا نفعل كل شيء بشكل جيد ، ولكن من التعقيد المتصور. لنفترض أن لديك 50000 سطر من التعليمات البرمجية ، وكلها مفيدة. كيف تنظمهم حتى لا يصابوا بالجنون (أم لا يتركون العمل في 11 ليلة)؟ لا يمكننا تقليل عدد العمليات ، ولكن يمكننا تقليل عدد الاتصالات بينهما (التغليف يساعدنا في هذا). نخفي التنفيذ المعقد وراء واجهة بسيطة ونواصل العمل فقط مع الواجهة. على سبيل المثال ، يعد الإنترنت أمرًا معقدًا للغاية ، لكن معظم المطورين لديهم معرفة كافية ببروتوكول HTTP للقيام بعملهم
وترك الشبكة والمستويات المادية وغيرها لمسؤولي النظام .
كلما كان اتصال وحداتنا أضعف ، كان
التعقيد أقل في مرحلة تكاملها مع بعضها البعض. كلما كانت الوحدة النمطية الأقل معرفة بالآخر ، كان الاتصال أقل. تساعدنا طرق ربط البيانات داخل الوحدة النمطية في التخلص من هذه المعرفة من مستهلكي الوحدة. هذه هي الميزة العملية الرئيسية ل OOP. على ماذا؟ أعلاه النهج دون بيانات وطريقة ملزمة. FP ، كما اكتشفنا ، لا يقول أي شيء عن هذا. يمكنك تمرير الفئات كوسيطات إلى وظائف بحتة ، أو يمكنك استخدام وظائف بحتة كوسيلة لفئة ما ، لا تتعارض مع بعضها البعض ، ولكنها تكمِّلها فقط.
في الممارسة العملية ، حيث يعمل نهج واحد بشكل رئيسي ، وأين هو الآخر بشكل رئيسي؟ عندما أكتب
خلفية على NodeJS ، فإنه يتحول بطريقة أو بأخرى في نموذج
وظيفي من تلقاء نفسه. لماذا؟ لأن الطلب على الخادم هو بطبيعته وظيفة ، مع إدخال وإخراج ثابت. تقع الطريقة الوظيفية في طلبات الخادم بشكل طبيعي للغاية ، والكود أكثر إحكاما ومرونة. عندما أقوم بإنشاء
واجهة أمامية للمتصفح ، تعمل
OOP عادة بشكل أفضل ، لأنه بالإضافة إلى المدخلات والمخرجات ، لدينا أيضًا مجموعة
من أحداث المستخدم ، وكذلك أحداث البرنامج ، مثل بداية الرسوم المتحركة ونهايتها ، وطلبات الخادم ، وما إلى ذلك ... إذا كان الأمر مجرد رسم صفحة ثابتة دون تفاعل ، عند استخدام FP في الواجهة الأمامية ، إما أن وقت التفاعل أو التطوير يعاني (وفقًا لقياساتنا ، كل 3 مرات). لماذا؟
ويستند أي نموذج البرمجة على نموذج واقع معين ، والنموذج هو دائما التبسيط. في FP ، يفرض النموذج المزيد من القيود على العالم ، لذلك فمن الأسهل إضفاء طابع رسمي عليه. للسبب نفسه ، عندما يصبح غير ذي صلة بشروط المشكلة ، يبدأ في طلب المزيد من العكازات. على سبيل المثال ، حل FIs للجهة الأمامية مشكلة إدخال المستخدم عن طريق إنشاء مجموعة من الأحداث (الإجراءات ، التكرار مرحبا). ولكن هذا هو تجريد غير ذي صلة ، والذي ، بالإضافة إلى تأثيره على الأداء ، يزيد بشكل كبير من وقت التطوير. باستخدام هذا النهج ، يمكنك إنشاء قائمة ما يجب عمله ، لكن في المشروعات الكبيرة حقًا ، يجب عليك كسر الطوب باستخدام جبينك ، ثم كتابة مقالات منتصرة لنفس المقالات المؤسفة. للمقارنة ، عندما كتبنا محطة التبادل (على الفانيليا js ، بالطبع) مع canvas ، svg وتحديثها عدة مرات في الثانية عبر websockets ، في بعض المكونات التي تم تحديثها بشكل متكرر ، لم نحذف divs ، ولكن إعادة استخدامها ، لأن إعادة إنشائها باهظة الثمن نسبيًا العملية في المتصفح (وهذا مهم إذا كان لديك
تطبيق كبير حقًا ). إذا قمت بالبرمجة في الواجهة الأمامية ، فلن يكون لديك مثل هذا التفكير ، لأنك قد توصلت بالفعل إلى توافق مع الثبات (بالمناسبة ، هذا شيء رائع للعمل مع تعدد الإصدارات ، وهو
ما لا يحدث في JS) ، بحيث تمر كل حركة بكل مخفض وغيرها من القمامة. من ناحية أخرى ، غالبًا ما يتضح أنه في الخلفية ، يتفادى الاستغناء عن الفصول على الإطلاق ، حيث يمكنك فقط تجنب تكلفة إنشائها ، نظرًا لأن شروط المهام وثيقة الصلة بنموذج FP. ولكن بالنسبة للجزء الأكبر ، فإن مطوري Java و PHP ليسوا في عجلة من أمرهم لدراسة FP ، فالموردون الأماميون هم في المقدمة ، والذين هم في أمس الحاجة إليها. كتمرين للعقل - إنه أمر مثير للاهتمام بالطبع ، يتم الحصول على البرامج فقط ... ولكن ، وشخص آخر لاستخدامها. على الرغم من أن الواجهة الأمامية عبارة عن قسم صغير نسبيًا من تكنولوجيا المعلومات ، ومهامه التي لم يتم حلها هناك لعدة أجيال. ما ، على ما يبدو ، ليست ممارسة للعقل؟