जैसे कोड:
public Thing[] getThings(){
return things;
}
बहुत मतलब नहीं है, क्योंकि आपकी पहुंच विधि कुछ भी नहीं कर रही है लेकिन सीधे आंतरिक डेटा संरचना को वापस कर रही है। आप के रूप में अच्छी तरह से सिर्फ घोषणा Thing[] things
हो सकती है public
। एक एक्सेस पद्धति के पीछे का विचार एक ऐसा इंटरफ़ेस बनाना है जो क्लाइंट को आंतरिक परिवर्तनों से बचाता है और उन्हें वास्तविक डेटा संरचना में हेरफेर करने से रोकता है, जबकि इंटरफ़ेस द्वारा अनुमत तरीके से छोड़कर। जब आपको पता चला कि आपका सभी क्लाइंट कोड टूट गया है, तो आपकी पहुँच विधि ने ऐसा नहीं किया है - यह केवल व्यर्थ कोड है। मुझे लगता है कि बहुत से प्रोग्रामर इस तरह से कोड लिखते हैं क्योंकि वे कहीं न कहीं सीखते हैं कि एक्सेस विधियों के साथ सब कुछ एनकैप्सुलेट करने की आवश्यकता है - लेकिन यह मेरे द्वारा बताए गए कारणों के लिए है। ऐसा करना केवल "फ़ॉर्म का पालन करना" है जब एक्सेस विधि किसी भी उद्देश्य की सेवा नहीं कर रही है तो केवल शोर है।
मैं निश्चित रूप से आपके प्रस्तावित समाधान की सिफारिश करूंगा, जो एन्कैप्सुलेशन के कुछ सबसे महत्वपूर्ण लक्ष्यों को पूरा करता है: ग्राहकों को एक मजबूत, विचारशील इंटरफ़ेस देना जो उन्हें आपकी कक्षा के आंतरिक कार्यान्वयन विवरणों से प्रेरित करता है, और उन्हें आंतरिक डेटा संरचना को छूने की अनुमति नहीं देता है। आपके द्वारा तय किए जाने वाले तरीकों में उम्मीद है कि - "कम से कम आवश्यक विशेषाधिकार का कानून"। यदि आप सीएलआर, एसटीएल, वीसीएल जैसे बड़े लोकप्रिय ओओपी ढांचे को देखते हैं, तो आपके द्वारा प्रस्तावित पैटर्न व्यापक है, ठीक उसी कारण से।
क्या आपको हमेशा ऐसा करना चाहिए ? जरुरी नहीं। उदाहरण के लिए, यदि आपके पास सहायक या मित्र कक्षाएं हैं जो अनिवार्य रूप से आपके मुख्य कार्यकर्ता वर्ग का एक घटक हैं और "सामने की ओर" नहीं हैं, तो यह आवश्यक नहीं है - यह एक ओवरकिल है जो बहुत सारे अनावश्यक कोड जोड़ने जा रहा है। और उस मामले में, मैं एक पहुंच विधि का उपयोग नहीं करूंगा - यह समझदार है, जैसा कि समझाया गया है। केवल डेटा संरचना को इस तरह से घोषित करें जो केवल मुख्य वर्ग के लिए स्कूप किया जाता है जो इसका उपयोग करता है - अधिकांश भाषाएं ऐसा करने के तरीकों का समर्थन करती हैं - friend
या इसे मुख्य कार्यकर्ता वर्ग, आदि के रूप में उसी फ़ाइल में घोषित करती हैं।
केवल नकारात्मक पक्ष मैं आपके प्रस्ताव में यह देख सकता हूं कि कोड को और अधिक काम करना है (और अब आप अपने उपभोक्ता वर्गों को फिर से कोड करने जा रहे हैं - लेकिन आपको वैसे भी ऐसा करना होगा।) लेकिन यह वास्तव में नकारात्मक पक्ष नहीं है। - आपको इसे सही तरीके से करने की आवश्यकता है, और कभी-कभी यह अधिक काम लेता है।
एक प्रोग्रामर को अच्छा बनाने वाली चीजों में से एक यह है कि वे जानते हैं कि अतिरिक्त काम कब इसके लायक है, और कब नहीं। अतिरिक्त में डाल लंबे समय में अब भविष्य में बड़े लाभांश के साथ भुगतान करेंगे - यदि इस परियोजना पर नहीं, तो दूसरों पर। सही तरीके से कोड करना सीखें और इसके बारे में अपने सिर का उपयोग करें, न कि केवल रोबोट द्वारा निर्धारित रूपों का पालन करें।
ध्यान दें कि सरणियों से अधिक जटिल संग्रह आंतरिक डेटा संरचना तक पहुंचने के लिए तीन से अधिक तरीकों को लागू करने के लिए संलग्न वर्ग की आवश्यकता हो सकती है।
यदि आप एक संपूर्ण डेटा संरचना को एक युक्त वर्ग के माध्यम से उजागर कर रहे हैं, तो IMO के बारे में आपको यह सोचने की आवश्यकता है कि क्यों उस वर्ग को पूरी तरह से समझाया गया है, अगर यह केवल एक सुरक्षित इंटरफ़ेस प्रदान करने के लिए नहीं है - एक "आवरण वर्ग"। आप कह रहे हैं कि युक्त वर्ग उस उद्देश्य के लिए मौजूद नहीं है - इसलिए शायद आपके डिजाइन के बारे में कुछ सही नहीं है। अधिक विचारशील मॉड्यूल में अपनी कक्षाओं को तोड़ने और उन्हें स्तरित करने पर विचार करें।
एक कक्षा में एक स्पष्ट और विचारशील उद्देश्य होना चाहिए, और उस कार्यक्षमता का समर्थन करने के लिए एक इंटरफ़ेस प्रदान करना चाहिए - और नहीं। आप चीजों को एक साथ जोड़ने की कोशिश कर सकते हैं जो एक साथ नहीं हैं। जब आप ऐसा करते हैं, तो हर बार आपको बदलाव को लागू करना होगा। आपकी कक्षाएं जितनी छोटी और अधिक समझदार होंगी, आसपास की चीजों को बदलना उतना ही आसान होगा: थिंक लेगो।
get(index)
,add()
,size()
,remove(index)
, औरremove(Object)
। प्रस्तावित तकनीक का उपयोग करते हुए, इस ArrayList वाले वर्ग में आंतरिक संग्रह को सौंपने के लिए पांच सार्वजनिक तरीके होने चाहिए। और कार्यक्रम में इस वर्ग का उद्देश्य सबसे अधिक इस ArrayList को इनकैप्सुलेट नहीं करना है, बल्कि कुछ और करना है। ArrayList एक विस्तार है। [...]