मेरे पास मेरे अनुप्रयोगों में अपरिवर्तनीय डेटा का उपयोग करने के लाभों का एक अच्छा विचार है और मैं एक सरल सिंक्रोनस प्रोग्रामिंग वातावरण में इन अपरिवर्तनीय संरचनाओं का उपयोग करने के विचार से काफी सहज हूं।एसिंक सिस्टम में अपरिवर्तनीय डेटा
वहाँ कि पुनरावर्ती कॉल, कुछ इस तरह की एक श्रृंखला में साथ राज्य पारित करके एक खेल के लिए प्रबंध स्थिति का वर्णन करती स्टैक ओवरफ़्लो पर कहीं एक अच्छा उदाहरण है:
function update(state) {
sleep(100)
return update({
ticks: state.ticks + 1,
player: player
})
}
हम कुछ मनमाने ढंग से, पक्ष क्या कर सकते हैं फ़ंक्शन के शरीर में प्रभाव मुक्त कार्य करें, फिर हम पुराने को बदलने के बजाए एक नया राज्य वापस कर दें।
जावास्क्रिप्ट कहने में, इसे सरल एसिंक मॉडल में अनुवाद करना काफी आसान लगता है।
function update(state) {
const newState = {
player,
ticks: state.ticks + 1
};
setTimeout(update.bind(this, newState), 100);
}
हालांकि, जैसे ही हम अतुल्यकालिक घटनाओं के लिए अधिक स्रोतों है, यह राज्य अपरिवर्तनीय और कार्यों को शुद्ध रखने के प्रबंधन करने के लिए एक बहुत कठिन हो रहा है।
यदि हम उदाहरण के लिए एक क्लिक ईवेंट जोड़ते हैं, तो हम इस तरह दिखने वाले कोड के साथ समाप्त होते हैं।
window.addEventListener('click', function() {
// I have no idea what the state is
// because only our update loop knows about it
});
अब जाहिर है, मैं नहीं चाहता कि इस पद्धति में राज्य उत्परिवर्तित करना चाहते हैं, लेकिन मैं एक नया राज्य है, कुछ इस तरह बनाने के लिए राज्य का उपयोग करने की जरूरत है।
window.addEventListener('click', function() {
const state = getState();
createState({
player,
clicks: clicks + 1
});
});
लेकिन ऐसा लगता है कि इस तरह के किसी प्रकार के परिवर्तनीय राज्य प्रबंधक की आवश्यकता है?
window.addEventListener('click', function() {
createAction('click', e);
});
function update(state, actions) {
const newState = {
player,
ticks: state.ticks + 1,
clicks: state.clicks + actions.clicks.length
};
setTimeout(update.bind(this, newState, []), 100);
}
फिर, यह विशेष रूप से कार्यात्मक महसूस नहीं करता है और कम से पर निर्भर करता है:
वैकल्पिक रूप से, मुझे लगता है मैं कार्यों की एक कतार में, कुछ की तरह क्लिक करें घटना जोड़ सकता है अद्यतन पाश के भीतर संसाधित करने के लिए लगता है रास्ते में कहीं कम से कम कुछ परिवर्तनीय राज्य। ये शायद किसी ऐसे व्यक्ति से आने वाले बेवकूफ दृष्टिकोण हैं जो अधिकतर उत्परिवर्तनीय राज्य और अनिवार्य वस्तु उन्मुख प्रोग्रामिंग के साथ काम करते हैं।
सिस्टम के लिए डिज़ाइन कैसा दिखता है जब कई एसिंक्रोनस ईवेंट स्रोत होते हैं और हम सब कुछ अपरिवर्तनीय होना चाहते हैं? या कम से कम, इस तरह की प्रणाली में परिवर्तनशीलता को नियंत्रित करने के लिए एक अच्छा पैटर्न क्या है?
आप कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग (एफआरपी) के लिए देख रहे हैं। – Bergi
वह कतार वास्तव में एक उचित तरीके की तरह लगती है (बस इसे 'अपडेट' में उपभोग करने के बाद इसे साफ़ करना न भूलें)। लेकिन वास्तव में आपको हमेशा अपने कार्यक्रम के कुछ छोटे हिस्से को उत्परिवर्तनीय होने की आवश्यकता होती है, क्योंकि एक क्लिक * जैसे * एक साइड इफेक्ट होता है (या यह कुछ भी नहीं करता है)। Immutabiltity आपके प्रोग्राम में कभी भी कुछ भी करने के बारे में नहीं है, यह आपके द्वारा किए जा रहे कार्यों को उचित रूप से मॉडलिंग करने के बारे में है। – Bergi
@ बर्गि से सहमत हुए। घटनाक्रम, परिभाषा के अनुसार, राज्यिक हैं; इनपुट, परिभाषा के अनुसार, mutable है। आपके मामले में सबसे अच्छी बात यह है कि आप जितना संभव हो सके अपरिवर्तनीय राज्य से उत्परिवर्तनीय राज्य को अलग करने का प्रयास करें। कतार वास्तव में अच्छी तरह से काम करती है (विशेष रूप से एक गेम स्टैंडपॉइंट से; मैंने इसे स्वयं इस्तेमाल किया है) और इसलिए आपके मामले में, कतार उत्परिवर्तनीय हो सकती है - आप ईवेंट को जोड़ना जारी रख सकते हैं - अगले अपडेट तक। उस बिंदु पर, आपको कतार की एक अपरिवर्तनीय प्रतिलिपि बनाने की आवश्यकता है। उसके बाद, आप अपरिवर्तनीय संरचनाओं के साथ रह सकते हैं। –