1 परिचय
हम आज के पाठ को इनकैप्सुलेशन के लिए समर्पित करना चाहते हैं । आप पहले से ही जानते हैं कि यह सामान्य शब्दों में क्या है।
कैप्सूलीकरण के क्या लाभ हैं? उनमें से काफी कुछ हैं, लेकिन मैं चार को बाहर कर सकता हूं, जो मेरी राय में मुख्य हैं:
2. वैध आंतरिक स्थिति
कार्यक्रमों में, अक्सर ऐसी स्थितियाँ उत्पन्न होती हैं जब कोई वस्तु कई अन्य वर्गों के साथ परस्पर क्रिया करती है। ऑब्जेक्ट के साथ ये इंटरैक्शन ऑब्जेक्ट के अंदर डेटा को दूषित कर सकते हैं, जिससे ऑब्जेक्ट के लिए अपेक्षित रूप से काम करना जारी रखना असंभव हो जाता है।
नतीजतन, वस्तु को अपने आंतरिक डेटा में किसी भी परिवर्तन का ट्रैक रखने की आवश्यकता होती है, या बेहतर अभी तक, स्वयं परिवर्तन करें।
यदि हम नहीं चाहते कि कुछ चर अन्य वर्गों द्वारा बदले जाएं, तो हम इसे निजी घोषित करते हैं। एक बार जब हम ऐसा कर लेते हैं, तो केवल उसके अपने वर्ग के तरीके ही उस तक पहुँच सकते हैं। यदि हम चाहते हैं कि चर केवल पढ़ने के लिए हों, तो हमें public getter
संबंधित चरों के लिए a जोड़ना होगा।
उदाहरण के लिए, मान लीजिए कि हम चाहते हैं कि हर कोई हमारे संग्रह में तत्वों की संख्या जान सके, लेकिन हम नहीं चाहते कि वे हमारी अनुमति के बिना संग्रह को बदल सकें। फिर हम एक private int count
चर और एक public getCount()
विधि घोषित करते हैं।
एनकैप्सुलेशन का उचित उपयोग यह सुनिश्चित करता है कि कोई भी वर्ग सीधे हमारी कक्षा के आंतरिक डेटा तक नहीं पहुंच सकता है, जो हमारे नियंत्रण से परे किसी भी परिवर्तन को रोकता है। ये परिवर्तन केवल उसी वर्ग के तरीकों को कॉल करने के माध्यम से संभव हैं, जैसे कि वेरिएबल्स को बदला जा रहा है।
यह मान लेना सबसे अच्छा है कि अन्य प्रोग्रामर हमेशा आपकी कक्षाओं का उपयोग उस तरीके से करेंगे जो उनके लिए सबसे सुविधाजनक है, न कि उस तरीके से जो आपके लिए (आपकी कक्षा के लिए) सबसे सुरक्षित है। यह व्यवहार बग और उन्हें रोकने के प्रयासों दोनों का स्रोत है।
3. विधि तर्कों को मान्य करना
कभी-कभी हमें अपने तरीकों में दिए गए तर्कों को मान्य करने की आवश्यकता होती है। उदाहरण के लिए, मान लें कि हमारे पास एक वर्ग है जो एक व्यक्ति का प्रतिनिधित्व करता है और आपको जन्मतिथि निर्धारित करने देता है। हमें यह सुनिश्चित करने के लिए सभी इनपुट डेटा की जांच करनी चाहिए कि यह प्रोग्राम के तर्क और हमारी कक्षा के तर्क के साथ समझ में आता है। उदाहरण के लिए, 13वें महीने या 30 फरवरी को किसी जन्मतिथि को अस्वीकार करना, इत्यादि।
कोई अपनी जन्म तिथि के लिए 30 फरवरी का संकेत क्यों देगा? सबसे पहले, डेटा दर्ज करते समय यह एक उपयोगकर्ता त्रुटि हो सकती है। दूसरा, घड़ी की कल की तरह चलने से पहले एक कार्यक्रम में बहुत सारी त्रुटियाँ हो सकती हैं। उदाहरण के लिए, निम्न स्थिति संभव है।
एक प्रोग्रामर एक प्रोग्राम लिखता है जो उन लोगों की पहचान करता है जिनका जन्मदिन परसों है। उदाहरण के लिए, मान लें कि आज 3 मार्च है। कार्यक्रम महीने के वर्तमान दिन में नंबर 2 जोड़ता है और 5 मार्च को पैदा हुए सभी लोगों की तलाश करता है। ऐसा लगता है कि सब कुछ सही है।
लेकिन जब 30 मार्च आता है, तो प्रोग्राम किसी को नहीं ढूंढेगा, क्योंकि कैलेंडर में 32 मार्च नहीं है।
याद रखें जब हमने ArrayList
इसके कोड का अध्ययन और विश्लेषण किया था? हमने देखा कि और विधियाँ जाँचती हैं कि क्या शून्य से अधिक या उसके get
बराबर है और सरणी की लंबाई से कम है। set
index
क्या अधिक है, यदि सूचकांक सरणी की सीमा के बाहर आता है, तो ये विधियाँ एक अपवाद फेंक देंगी। यह इनपुट सत्यापन का एक उत्कृष्ट उदाहरण है।
4. कोड बदलते समय त्रुटियों को कम करना
मान लीजिए कि जब हम किसी बड़े प्रोजेक्ट में शामिल थे तो हमने एक सुपर उपयोगी क्लास लिखी। सभी को यह इतना पसंद आया कि दूसरे प्रोग्रामर इसे अपने कोड में सैकड़ों जगहों पर इस्तेमाल करने लगे।
कक्षा इतनी उपयोगी थी कि आपने इसमें कुछ सुधार करने का निर्णय लिया। लेकिन अगर आप क्लास से किसी भी तरीके को हटाते हैं, तो दर्जनों लोगों का कोड कंपाइल होना बंद हो जाएगा। उन्हें सब कुछ फिर से लिखना होगा। और आप जितने अधिक परिवर्तन करेंगे, आप उतनी ही अधिक त्रुटियाँ पैदा करेंगे। तुम बहुत सभाओं को तोड़ोगे और तुम से घृणा की जाएगी।
लेकिन जब हम उन तरीकों को बदलते हैं जिन्हें निजी घोषित किया जाता है, तो हम जानते हैं कि कहीं भी कोई अन्य वर्ग नहीं है जो इन तरीकों को बुला सके। हम उन्हें फिर से लिख सकते हैं, मापदंडों की संख्या और उनके प्रकार बदल सकते हैं, और कोई भी निर्भर बाहरी कोड काम करना जारी रखेगा। ठीक है, कम से कम यह संकलन करेगा।
5. हम तय करते हैं कि हमारी वस्तु बाहरी वस्तुओं के साथ कैसे संपर्क करती है
हम कुछ ऐसी कार्रवाइयों को प्रतिबंधित कर सकते हैं जिन्हें हमारी वस्तु के साथ किया जा सकता है। उदाहरण के लिए, मान लीजिए कि हम चाहते हैं कि किसी वस्तु को केवल एक बार तत्काल किया जाए। भले ही इसे प्रोजेक्ट में कई जगहों पर बनाया गया हो। और हम इसे एनकैप्सुलेशन के लिए धन्यवाद कर सकते हैं।
एनकैप्सुलेशन हमें अतिरिक्त प्रतिबंध जोड़ने देता है, जिसे अतिरिक्त लाभों में बदला जा सकता है । उदाहरण के लिए, String
वर्ग को एक अपरिवर्तनीय वस्तु के रूप में कार्यान्वित किया जाता है। वर्ग का एक वस्तु String
उसके निर्माण के क्षण से उसकी मृत्यु के क्षण तक अपरिवर्तनीय है। वर्ग के सभी तरीके String
( remove
, substring
, ...), उस वस्तु में कोई बदलाव किए बिना एक नया स्ट्रिंग लौटाते हैं जिस पर उन्हें बुलाया जाता है।
एनकैप्सुलेशन एक बहुत ही दिलचस्प चीज है।
GO TO FULL VERSION