सबसे पहले आपको प्रतिमान पर स्पष्ट होना चाहिए।
- डेटा स्ट्रक्चर्स -> मेमोरी का एक लेआउट जिसे उपयुक्त जानकार कार्यों द्वारा ट्रेस और हेरफेर किया जा सकता है।
- ऑब्जेक्ट्स -> एक स्व-निहित मॉड्यूल जो इसके कार्यान्वयन को छुपाता है और एक इंटरफ़ेस प्रदान करता है जिसके माध्यम से संचार किया जा सकता है।
गेट्टर / सेटर कहां उपयोगी है?
क्या डेटा संरचना में गेटर्स / सेटर्स उपयोगी हैं? नहीं।
डेटा संरचना एक मेमोरी लेआउट विनिर्देश है जो फ़ंक्शन के परिवार द्वारा आम है और हेरफेर किया गया है।
आम तौर पर कोई भी पुराना नया फंक्शन साथ आ सकता है और डेटा-स्ट्रक्चर में फेरबदल कर सकता है, अगर यह इस तरह से होता है कि अन्य फ़ंक्शन अभी भी इसे समझ सकते हैं, तो यह फ़ंक्शन परिवार में शामिल हो जाता है। अन्यथा इसका एक दुष्ट कार्य और कीड़े का एक स्रोत है।
मुझे गलत मत समझिए कि हर जगह टांके, टर्न-कोट्स और डबल-एजेंट्स के साथ उस डेटा-स्ट्रक्चर पर वार करने वाले फंक्शन्स के कई परिवार हो सकते हैं। यह ठीक है जब वे प्रत्येक के साथ खेलने के लिए अपनी स्वयं की डेटा-संरचना है, लेकिन जब वे इसे साझा करते हैं ... बस राजनीति पर असहमत कई अपराध परिवारों की कल्पना करें, यह वास्तव में तेजी से गड़बड़ हो सकता है।
यह देखते हुए कि गड़बड़ विस्तारित फंक्शन परिवारों को प्राप्त हो सकता है, क्या डेटा संरचना को एन्कोड करने का एक तरीका है ताकि दुष्ट फ़ंक्शन सब कुछ गड़बड़ न करें? हां, उन्हें ऑब्जेक्ट कहा जाता है।
क्या ऑब्जेक्ट में गेटर्स / सेटर उपयोगी हैं? नहीं।
एक वस्तु में एक डेटा संरचना को लपेटने का पूरा बिंदु यह सुनिश्चित करना था कि कोई दुष्ट कार्य मौजूद न हो। यदि फ़ंक्शन परिवार में शामिल होना चाहता था, तो उसे पहले अच्छी तरह से वीटो करना पड़ा और फिर ऑब्जेक्ट का हिस्सा बन गया।
एक गेट्टर और एक सेटर का बिंदु / उद्देश्य सीधे ऑब्जेक्ट के मेमोरी लेआउट को बदलने के लिए ऑब्जेक्ट के बाहर फ़ंक्शन करने की अनुमति देता है। कि बदमाशों को अनुमति देने के लिए एक खुले दरवाजे की तरह लगता है ...
द एज केस
वहाँ दो स्थितियों में एक सार्वजनिक पानेवाला / सेटर मेक सेंस थे।
- ऑब्जेक्ट के भीतर डेटा-संरचना का एक हिस्सा ऑब्जेक्ट द्वारा प्रबंधित किया जाता है, लेकिन ऑब्जेक्ट द्वारा नियंत्रित नहीं किया जाता है।
- डेटा-संरचना के एक उच्च-स्तरीय अमूर्त वर्णन करने वाला एक इंटरफ़ेस जहां कुछ तत्वों को कार्यान्वयन ऑब्जेक्ट के नियंत्रण में नहीं होने की उम्मीद है।
कंटेनर और कंटेनर इंटरफेस इन दोनों स्थितियों में से दोनों के आदर्श उदाहरण हैं। कंटेनर आंतरिक रूप से डेटा-संरचनाओं (लिंक्ड-लिस्ट, मैप, ट्री) का प्रबंधन करता है, लेकिन सभी के लिए विशिष्ट तत्व और हाथ पर नियंत्रण रखता है। इंटरफ़ेस यह सार करता है और कार्यान्वयन को पूरी तरह से अनदेखा करता है और बस अपेक्षाओं का वर्णन करता है।
दुर्भाग्य से कई कार्यान्वयन इस गलत हो जाते हैं और वास्तविक वस्तु तक सीधे पहुंच देने के लिए इस प्रकार की वस्तुओं के इंटरफेस को परिभाषित करते हैं। कुछ इस तरह:
interface Container<T>
{
typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
TRef item(int index);
}
यह टूट गया है। कंटेनर के कार्यान्वयन को स्पष्ट रूप से उनके इंटर्नल को नियंत्रित करना चाहिए जो उन्हें इस्तेमाल करता है। मुझे अभी तक एक परिवर्तनशील-मूल्य वाली भाषा दिखाई दे रही है, जहां यह ठीक है (अपरिवर्तनीय-मूल्य शब्दार्थ वाली भाषाएं डेटा-भ्रष्टाचार के परिप्रेक्ष्य से परिभाषा ठीक हैं, लेकिन जरूरी नहीं कि डेटा-जासूसी के दृष्टिकोण से)।
आप केवल कॉपी-शब्दार्थ का उपयोग करके, या प्रॉक्सी का उपयोग करके गेटर्स / सेटर को सुधार / सुधार सकते हैं:
interface Proxy<T>
{
operator T(); //<returns a copy
... operator ->(); //<permits a function call to be forwarded to an element
Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}
interface Container<T>
{
Proxy<T> item(int index);
T item(int index); //<When T is a copy of the original value.
void item(int index, T new_value); //<where new_value is used to replace the old value
}
संभवतः एक दुष्ट फ़ंक्शन अभी भी यहां तबाही खेल सकता है (पर्याप्त प्रयास के साथ अधिकांश चीजें संभव हैं), लेकिन कॉपी-शब्दार्थ और / या प्रॉक्सी कई त्रुटियों के लिए मौका कम कर देता है।
- बाढ़
- अधःप्रवाह
- उप तत्व के साथ बातचीत टाइप-चेक / टाइप-चेक करने योग्य होती है (प्रकार भाषा में खो जाना यह एक वरदान है)
- वास्तविक तत्व स्मृति निवासी हो सकता है या नहीं भी हो सकता है।
निजी गेटर्स / सेटर्स
यह गेटर्स का अंतिम गढ़ है और सीधे प्रकार पर काम कर रहा है। वास्तव में मैं इन गेटर्स और सेटर्स को एक्सेस नहीं करूंगा लेकिन एक्सेसर्स और मैनिपुलेटर्स।
इस संदर्भ में कभी-कभी डेटा-संरचना के एक विशिष्ट भाग में हेरफेर करना हमेशा / लगभग-हमेशा / आमतौर पर होने वाली विशिष्ट पुस्तक की आवश्यकता होती है। जब आप किसी पेड़ की जड़ को अपडेट करते हैं तो कहें कि लुक-साइड कैश को शुद्ध करने की आवश्यकता है, या जब आप बाहरी डेटा तत्व का उपयोग करते हैं, तो एक लॉक प्राप्त / जारी करने की आवश्यकता होती है। इन मामलों में DRY प्रिंसिपल को लागू करना और उन कार्यों को एक साथ पार्सल करना समझ में आता है।
निजी संदर्भ के भीतर, परिवार में अन्य कार्यों के लिए यह संभव है कि इन 'गेटर्स एंड सेवर्स' को साइड-स्टेप किया जाए और डेटा संरचना में हेरफेर किया जाए। इसलिए मैं उन्हें एक्सेसर्स और मैनिपुलेटर्स के रूप में अधिक क्यों समझता हूं। आप डेटा को सीधे एक्सेस कर सकते हैं, या उस हिस्से को सही पाने के लिए परिवार के किसी अन्य सदस्य पर भरोसा कर सकते हैं।
संरक्षित गेट / सेटर्स
एक संरक्षित संदर्भ में, यह सार्वजनिक संदर्भ के लिए बहुत भिन्न नहीं है। विदेशी संभवतः दुष्ट कार्य डेटा-संरचना तक पहुंच चाहते हैं। इसलिए नहीं, यदि वे मौजूद हैं तो वे सार्वजनिक गेटर्स / सेटर की तरह काम करते हैं।
this->variable = x + 5
एकUpdateStatistics
फ़ंक्शन करना या कॉल करना चाहते हैं , और उन मामलों मेंclassinstancea->variable = 5
समस्याएँ पैदा होंगी।