سؤال

لقد تم مؤخرا التعلم عن البرمجة الوظيفية (على وجه التحديد هاسكل, ولكن كنت قد ذهبت من خلال الدروس على Lisp و إرلانج كذلك).في حين وجدت المفاهيم المفيدة جدا, ما زلت لا أرى الجانب العملي من "آثار جانبية" المفهوم.ما هي مزايا عملية من هذا ؟ أنا أحاول أن أفكر في وظيفية عقلية ، ولكن هناك بعض الحالات التي تبدو معقدة للغاية دون القدرة على حفظ الدولة بطريقة سهلة (لا تنظر هاسكل monads 'سهلة').

هل يستحق الاستمرار في تعلم هاسكل (أو آخر وظيفية بحتة اللغة) في العمق .. وظيفية أو عديمي الجنسية البرمجة في الواقع أكثر إنتاجية من الإجرائية?غير أنه من المرجح أن سوف تستمر في استخدام هاسكل أو آخر لغة وظيفية في وقت لاحق ، أو يجب أن تعلم ذلك فقط من أجل الفهم ؟

لا يمكن أن الرعاية أقل عن الأداء من الإنتاجية.لذلك أنا أساسا يسأل ما إذا كنت سوف تكون أكثر إنتاجية في لغة وظيفية من الإجرائي/وجوه المنحى/أيا كان.

هل كانت مفيدة؟

المحلول

البرمجة الوظيفية في القشر.

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

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

نصائح أخرى

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

يمكنك العثور على تعليمي جيد مع الكثير من الأمثلة في جون هيوز ورقة لماذا البرمجة الوظيفية المسائل (PDF).

سوف تكون كتل أكثر إنتاجية ، خاصة إذا اخترت لغة وظيفية لديها أيضا جبري أنواع البيانات و مطابقة نمط (Caml, SML ، هاسكل).

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

وأجد في الواقع (من تجربة شخصية) أن البرمجة في F # مباريات الطريق أعتقد أفضل، وذلك أنه من الأسهل. أعتقد أن هذا هو أكبر الفرق. لقد المبرمجة في كلا F # و C #، وهناك الكثير أقل "محاربة اللغة" في F #، الذي أحب. لم يكن لديك للتفكير في التفاصيل في F #. وإليك بعض الأمثلة على ما وجدتها أنا أستمتع حقا.

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

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

let matchingFactors =
    factors
    |> Seq.filter (fun x -> largestPalindrome % x = 0)
    |> Seq.map (fun x -> (x, largestPalindrome / x))

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

وكما أنني أحب |> المشغل، الذي أعتقد أنه يفصل F # من لغة كامل الموضوعية، واللغات وظيفية ربما غيرها. انها المشغل الأنابيب، فإنه يتيح لك "أنابيب" إخراج تعبير واحد في إدخال تعبير آخر. يجعل رمز متابعة كيف أفكر أكثر. كما في التعليمات البرمجية المتكررة أعلاه، هذا ما يقول، "اتخاذ سلسلة من العوامل، تصفية، ثم تعيين ذلك." انها على مستوى عال جدا من التفكير، والتي لم تحصل في لغة البرمجة حتمية لأنك كنت مشغولا حتى كتابة حلقة وإذا كانت تصريحات. انها الشيء الوحيد الذي افتقد أكثر كلما أذهب إلى لغة أخرى.

وهكذا فقط بشكل عام، على الرغم من أنني يمكن البرنامج في كل من C # و F #، أجد أنه من الأسهل استخدام F # لأنك يمكن أن نفكر على مستوى أعلى. أنا أزعم أن لتتم إزالة أصغر التفاصيل من البرمجة الوظيفية (في F # على الأقل)، أنني أكثر إنتاجية.

تعديل : في رأيت في واحدة من التعليقات التي طلب للحصول على مثال "الدولة" في لغة البرمجة الوظيفية. F # يمكن كتابة حتما، لذلك وهنا مثال مباشر لكيف يمكن أن يكون دولة قابلة للتغيير في F #:

let mutable x = 5
for i in 1..10 do
    x <- x + i

والنظر في جميع البق صعبة كنت قد قضى وقتا طويلا التصحيح.

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

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

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

وميزة واحدة من وظائف عديمي الجنسية هي أنها تسمح precalculation أو التخزين المؤقت من القيم عودة الدالة. حتى بعض المجمعين C تسمح لك علامة وظائف كما عديمي الجنسية صراحة لتحسين optimisability بهم. كما لاحظ العديد من الآخرين، وظائف عديمي الجنسية هي أسهل بكثير من parallelise.

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

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

ودون دولة، فمن السهل جدا أن تتم بشكل مواز تلقائيا التعليمات البرمجية (كما يتم إجراء وحدات المعالجة المركزية مع المزيد والمزيد من النوى وهذا مهم جدا).

وكتبت في ما بعد على هذا الموضوع فقط لحظة مرة أخرى: على أهمية الطهارة .

وتطبيقات الويب عديمو الجنسية ضرورية عند بدء تشغيل وجود ارتفاع حركة المرور.

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

وغالبا ما يكون

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top