سؤال

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

استخدام المبتذلة سبيل المثال, دعونا نقول أننا نتعامل مع تبسيط حساب البنك الكائنات/البنيات/أيا كان.في OOP اللغة لكنت بعض الطبقة عقد إشارة إلى BankAccount ، التي من شأنها أن المتغيرات سبيل المثال لأشياء مثل سعر الفائدة ، و أساليب مثل setInterestRate() التي تغير حالة الكائن و عموما لا عودة.في قول Clojure لكنت البنك-حساب البنية (مجد hashmap) ، والمهام الخاصة التي تأخذ في الحساب المصرفي المعلمة وغيرها من المعلومات ، والعودة البنية الجديدة.وذلك بدلا من تغيير الدولة من الكائن الأصلي ، لدي الآن واحدة جديدة تعاد مع التعديلات المرغوبة.

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

أتمنى أن معنى شكرا على أي مساعدة!

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

المحلول

في طراز عملي محض، فلن الكتابة فوق أي متغير.

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

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

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

نصائح أخرى

ويفترض في العالم OO لديك حلقة وتقوم بتعديل هذه الحسابات المصرفية مرارا وتكرارا في الاستجابة للطلبات. دعونا نفترض أن لديك مجموعة كاملة من الحسابات وهذه لها نوع المحفظة. ثم في هاسكل أن تكتب وظيفة نقية

updatePortfolio :: Request -> Portfolio -> Portfolio

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

readRequest :: IO Request  -- an action that, when performed, reads a Request with side effects

main :: Portfolio -> IO ()  -- a completely useless program that updates a Portfolio in response to a stream of Requests

main portfolio = do req <- readRequest
                    main (updatePortfolio req)

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

وهذه هي لعبة سبيل المثال جدا ولكن آمل أن يوفر لك قليلا من نكهة لغة وظيفية.

هكذا ... ماذا أفعل معها؟ الكتابة أيا كان المتغير تم الرجوع إلى البنك في الحساب القديم؟

نعم

إذا كان الأمر كذلك، فهل هذا يكون المزايا على نهج OOP المتغيرة الدولة؟

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

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

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

        b__
           |  
a -> [6|] -+-> [5|] -> [4|] -> [3|] -> [2|] -> [1|x]

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

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