अपरिवर्तनीय वस्तुएँ बनाम अपरिवर्तनीय संग्रह
उत्परिवर्तनीय बनाम अपरिवर्तनीय वस्तुओं पर बहस में एक बारीक बिंदु है संग्रह के लिए अपरिवर्तनीयता की अवधारणा का विस्तार करने की संभावना। एक अपरिवर्तनीय वस्तु एक ऐसी वस्तु है जो अक्सर डेटा की एकल तार्किक संरचना का प्रतिनिधित्व करती है (उदाहरण के लिए एक अपरिवर्तनीय स्ट्रिंग)। जब आपके पास एक अपरिवर्तनीय वस्तु का संदर्भ होता है, तो ऑब्जेक्ट की सामग्री नहीं बदलेगी।
अपरिवर्तनीय संग्रह एक संग्रह है जो कभी नहीं बदलता है।
जब मैं एक परिवर्तनशील संग्रह पर एक ऑपरेशन करता हूं, तो मैं संग्रह को जगह में बदल देता हूं, और संग्रह के संदर्भ वाली सभी संस्थाओं को परिवर्तन दिखाई देगा।
जब मैं एक अपरिवर्तनीय संग्रह पर एक ऑपरेशन करता हूं, तो एक संदर्भ नए संग्रह में वापस आ जाता है जो परिवर्तन को दर्शाता है। संग्रह के पिछले संस्करणों के संदर्भ वाली सभी संस्थाओं में परिवर्तन नहीं दिखेगा।
चतुर कार्यान्वयन को उस अपरिवर्तनीयता प्रदान करने के लिए पूरे संग्रह को कॉपी (क्लोन) करने की आवश्यकता नहीं है। सबसे सरल उदाहरण एक एकल लिंक की गई सूची और पुश / पॉप संचालन के रूप में लागू किया गया स्टैक है। आप नए संग्रह में पिछले संग्रह से सभी नोड्स का पुन: उपयोग कर सकते हैं, पुश के लिए केवल एक नोड जोड़ सकते हैं, और पॉप के लिए कोई नोड नहीं क्लोन कर सकते हैं। दूसरी ओर एक एकल लिंक की गई सूची पर पुश_टेल ऑपरेशन इतना सरल या कुशल नहीं है।
अपरिवर्तनीय बनाम म्यूटेबल चर / संदर्भ
कुछ कार्यात्मक भाषाएं केवल एक संदर्भ असाइनमेंट की अनुमति देते हुए, ऑब्जेक्ट संदर्भों के लिए अपरिवर्तनीयता की अवधारणा को लेती हैं।
- एर्लैंग में यह सभी "चर" के लिए सच है। मैं केवल एक बार संदर्भ के लिए ऑब्जेक्ट असाइन कर सकता हूं। अगर मुझे किसी संग्रह पर काम करना था, तो मैं नए संग्रह को पुराने संदर्भ (चर नाम) को फिर से असाइन नहीं कर पाऊंगा।
- स्काला इसे सभी संदर्भों के साथ भाषा में भी बनाता है जिसे var या val के साथ घोषित किया जा रहा है , vals केवल एकल असाइनमेंट है और एक कार्यात्मक शैली को बढ़ावा दे रहा है, लेकिन अधिक सी-लाइक या जावा जैसी प्रोग्राम संरचना की अनुमति देता है।
- Var / val घोषणा की आवश्यकता है, जबकि कई पारंपरिक भाषाएं वैकल्पिक संशोधक का उपयोग करती हैं जैसे कि java में अंतिम और C में कास्ट ।
विकास बनाम प्रदर्शन में आसानी
लगभग हमेशा एक अपरिवर्तनीय वस्तु का उपयोग करने का कारण कोड के बारे में साइड इफेक्ट फ्री प्रोग्रामिंग और सरल तर्क को बढ़ावा देना है (विशेषकर अत्यधिक समवर्ती / समानांतर वातावरण में)। यदि ऑब्जेक्ट अपरिवर्तनीय है, तो आपको किसी अन्य संस्था द्वारा अंतर्निहित डेटा के बारे में चिंता करने की ज़रूरत नहीं है।
मुख्य दोष प्रदर्शन है। यहाँ एक सरल परीक्षण पर लिखा गया है जो मैंने जावा में एक खिलौना समस्या में कुछ अपरिवर्तनीय बनाम उत्परिवर्तनीय वस्तुओं की तुलना में किया था ।
प्रदर्शन के मुद्दे कई अनुप्रयोगों में मूट होते हैं, लेकिन सभी नहीं, यही वजह है कि कई बड़े संख्यात्मक पैकेज, जैसे पायथन में नम्पी ऐरे क्लास, बड़े सरणियों के इन-प्लेस अपडेट के लिए अनुमति देते हैं। यह उन क्षेत्रों के लिए महत्वपूर्ण होगा जो बड़े मैट्रिक्स और वेक्टर ऑपरेशन का उपयोग करते हैं। यह बड़ी डेटा-समानांतर और कम्प्यूटेशनल रूप से गहन समस्याओं को जगह में संचालित करके एक महान गति प्राप्त करता है।
string
कम से कम .NET में अपरिवर्तनीय है, और मुझे कई अन्य आधुनिक भाषाओं में भी लगता है।