الترجمة: ما أهمية FI حتى بالنسبة لمبرمجي OOP؟

مرحبا يا هبر! أقدم لكم ترجمة لمقال رومان Provaznik - لماذا FP يهم حتى لمطوّر OOP؟

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

لقد طُلب مني إبداء رأي شخصي حول البرمجة الوظيفية من وجهة نظر موضوعية. اضطررت حتى لإنشاء حساب على الوسيط. بصفتي مطور OOP سابقًا وفي الوقت الحالي ، سأصبح يومًا ما مبرمجًا حقيقيًا لـ FP ، أعتقد أن لدي ما أقوله:

رحب بالمسافر


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

الثبات


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

أعلم ، أعلم - يبدو غريباً. لكن هذا التبديل الصغير للوعي سيسمح لك بالنوم أكثر هدوءًا. بمجرد أن تفهم أنه لا يمكن تغيير الأشياء الخاصة بك (يتم نسخها فقط) ، فستكون متأكدًا من أنه لن يتمكن أي شخص في الفريق من إعادة تعيينها في مكان آخر. إنه مثل استعارة الكاسيت الصوتي القديم بينك فلويد دون خوف من إعادة تسجيله مرة أخرى مع جاستن بيبر. وكمكافأة ، ستحتوي شفرتك على طرق يمكن تتبعها بالكامل تحدث فيها تغييرات حقيقية (حيث يتم إنشاء كائنات جديدة بناءً على الكائنات الأصلية). وكاد أن أنسى ما إذا كنت مطورًا لـ C # أو Java ، فأنت تستخدمه بالفعل عن طريق الاتصال بـ "ToLower ()" ، "Trim ()" على خطوط ثابتة في البداية. وهذا ليس بالأساس شيئًا جديدًا.

وظائف نقية


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

مرة أخرى ، فإن إعادة التفكير قليلاً في نهج الإدخال / الإخراج يعطي جميع مزايا FP ، بالإضافة إلى أن الاختبار يصبح بسيطًا للغاية لدرجة أنه سيبدأ في النهاية في جلب المتعة.

إعلان VS أمر حتمي


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

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

الملخص


أعتقد أن هذا يكفي الآن. لا أريد أن ينتهي بي الأمر ببيع FP كرصاصة فضية. العالم ليس أبيض وأسود فقط. الحقيقة هي أن FP صعب للغاية بالنسبة لي. تقريبا معقدة مثل OOP المناسبة. ولكن من المؤكد أنها تستحق المحاولة. من وجهة نظري ، OOP vs FP هو ، إلى حد كبير ، الطريقة التي أفكر بها في الكود وهيكله. كيف أفكر في التبعيات والآثار الجانبية والعالم كله من I / O والاختبار. لتلخيص بفكر واحد ، "إن النهج الوظيفي سيساعد ، بغض النظر عن اللغة ، والموضوع والمنصة."

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


All Articles