كائنات وظيفية غير قابلة للتغيير في مجال قابل للتغيير بدرجة كبيرة

StackOverflow https://stackoverflow.com/questions/166379

سؤال

أتعلم حاليًا البرمجة الوظيفية في وقت فراغي مع Scala، ولدي سؤال مبتدئ خامل.

أستطيع أن أرى أناقة وجود كائنات غير قابلة للتغيير عند القيام بشيء مثل حساب تحويل مويجات هار - أي.عندما لا تتغير البيانات التي تمثلها الكائنات نفسها.

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

هل يتم توسيع نطاق البرمجة الوظيفية لهذا، أم أن هذه حالة "أفضل أداة لأفضل وظيفة، ربما لا تكون غير قابلة للتغيير هنا"؟

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

المحلول

<اقتباس فقرة>   

للي فإنه يبدو وكأنه لن يكون هناك سرب عملاقة لفهرس الصور من الحالات الجديدة كل "القراد".

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

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

نصائح أخرى

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

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

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

وهناك MMORPG هو <م> بالفعل مثال على ثبات. منذ يتم توزيع اللعبة عبر خوادم وأنظمة الألعاب، ليست هناك ليس المركزي "gameworld" الكائن. وهكذا، أي الكائن الذي يحصل إرسالها عبر سلك غير قابل للتغيير - لأنه لا يحصل تغيير من قبل المتلقي. بدلا من ذلك، يتم إرسال كائن جديد أو رسالة كرد فعل، إذا كان هناك واحد.

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

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

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

وإذا كان الكائن على الكمبيوتر إما لاعب يمثلون خزان قابلة للتغيير أو غير قابل للتغيير غير ذي صلة. يمكن تنفيذ اي من الاتجاهين. كل لاعب لا يغير بشكل مباشر على الدولة من لعبة لاعبين آخرين.

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

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

شيء آخر مهم يجب مراعاته هو أن أقوى الأجهزة حاليًا تحتوي على 6 مراكز لكل وحدة معالجة مركزية.فكر في جهاز مزود بوحدة معالجة مركزية مزدوجة يحتوي كل منهما على 6 مراكز.يمكن لواحدة من هذه النوى الـ 12 أن تقوم بجمع البيانات المهملة وبالتالي يمكن تعويض الحمل الزائد الناتج عن هدم الكثير من الكائنات من خلال إمكانية توسيع التطبيق بسهولة إلى تلك النوى الـ 11 الأخرى.

تذكر أيضًا أنه ليس كل كائن (وكائناته الفرعية) يحتاج إلى إعادة بنائه بالكامل على نسخة.أي نوع مرجع لم يتغير لن يأخذ سوى تعيين مرجعي واحد عندما يتم "نسخ" الكائن.

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

ولقد وجدت بلوق اليوم أن صفقات بالضبط مع الأسئلة اثرت في هذا المنصب:

http://prog21.dadgum.com/23.html

ومثل حد كبير كل أداة في البرمجة، والأشياء ثابتة قوية، ولكن خطورة في الوضع الخاطئ. أعتقد أن المثال اللعبة ليست فكرة جيدة جدا أو على الأقل المفتعلة جدا.

واريك ليبرت لديه بعض حول الموضوع من ثبات، وانهم جدا قراءة مثيرة للاهتمام.

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