2011-06-09 14 views
5

मैं थोड़ा अस्पष्ट हूं कि सभी सदस्यों को कक्षा के भीतर निजी बनाने और उत्परिवर्तनों को संभालने के लिए सार्वजनिक तरीकों को बनाने में विचार कितना दूर है। आदिम प्रकार मुद्दे नहीं हैं, यह encapsulated वस्तु है कि मैं अस्पष्ट हूँ। ऑब्जेक्ट सदस्यों को निजी बनाने का लाभ उन विधियों को छिपाने की क्षमता है जो कक्षा के निर्माण के संदर्भ में लागू नहीं होते हैं। नकारात्मकता यह है कि आपको अंतर्निहित वस्तु (अधिक विधियों, अधिक काम) को पैरामीटर पास करने के लिए सार्वजनिक विधियां प्रदान करनी होंगी। दूसरी तरफ, यदि आप अंतर्निहित वस्तु के लिए सभी विधियों और संपत्तियों का खुलासा करना चाहते हैं, तो क्या आप वस्तु को सार्वजनिक नहीं कर सकते? वस्तुओं को इस तरह से उजागर करने में क्या खतरे हैं?पारित वस्तुओं को सार्वजनिक या निजी होना चाहिए?

उदाहरण के लिए, मुझे वेक्टर, या ऐरे लिस्ट, सब कुछ से सबकुछ प्राप्त करना उपयोगी लगेगा। एकमात्र नकारात्मक पक्ष मैं सोच सकता हूं कि सार्वजनिक सदस्य संभावित रूप से एक प्रकार को असाइन कर सकते हैं कि यह अंतर्निहित कास्टिंग (या उस पर कुछ प्रभाव नहीं) के माध्यम से नहीं है। क्या एक अस्थिर पदनाम समस्याओं की संभावना को कम करेगा?

बस एक तरफ नोट: मैं समझता हूं कि वास्तविक enapsulation का मतलब है कि सदस्य निजी हैं।

+0

जाएँ Demeter के कानून देखें http://en.wikipedia.org/wiki/Law_of_Demeter, एक ओओपी भाषा में आपको निर्भरताओं को कम करने की तलाश करनी चाहिए। यह निर्भर करता है कि "कक्षा" में वास्तव में कार्यक्षमता है या वास्तव में एक डेटा संरचना है। यदि यह केवल एक डेटा संरचना है तो गेटर्स 'एन' सेटर्स ओवरकिल लगते हैं, खासकर यदि सभी फ़ील्ड अपरिवर्तनीय (अंतिम) हो सकते हैं। – earcam

उत्तर

2

वस्तुओं को इस तरह से उजागर करने में क्या खतरे हैं?

उन वस्तुओं के प्रकार को बदलने से कक्षा में इंटरफ़ेस को बदलने की आवश्यकता होगी। निजी वस्तुओं + सार्वजनिक गेटर्स/सेटर्स के साथ, आपको केवल गेटर्स और सेटर्स में कोड को संशोधित करना होगा, मान लीजिए कि आप चीजों को वापस लौटा रखना चाहते हैं।

ध्यान दें कि यही कारण है कि पाइथन जैसी भाषाओं में गुण उपयोगी हैं, जो तकनीकी रूप से निजी वर्ग के सदस्य नहीं हैं, केवल सबसे ज्यादा अस्पष्ट हैं।

+1

लेकिन क्या आपको नहीं लगता कि यह 'निजी वस्तुओं + सार्वजनिक गेटर्स/सेटर्स' घोषित करने का नतीजा है? क्या होगा यदि वह सब कुछ सार्वजनिक घोषित करता है? हालांकि कई अन्य कारणों से सलाह नहीं दी जाती है, लेकिन मुझे नहीं लगता कि उत्तर –

+0

पर सवाल को न्यायसंगत बनाता है "क्या होगा यदि वह सब कुछ सार्वजनिक घोषित करता है?" फिर वहां कोई भी encapsulation नहीं है और सीधे उस वर्ग के सदस्य को बदलना जो सीधे सामने आया है उसे उस चीज़ को बदलने की आवश्यकता होगी जो सीधे-उजागर सदस्य तक पहुंचता है और उम्मीद करता है कि यह एक निश्चित तरीके से व्यवहार करे। आप इसके बारे में थोड़ा पीछे सोच रहे हैं। – JAB

0

ऑब्जेक्ट उन्मुख डिजाइन सिर्फ एक दिशानिर्देश है। उस व्यक्ति के परिप्रेक्ष्य से इसके बारे में सोचें जो आपकी कक्षा का उपयोग करेगा। इसे सहज और उपयोग करने में आसान बनाने के साथ बैलेंस ओओडी।

+0

अच्छी तरह से डाल दिया। फिर आप अपने नामकरण सम्मेलन को कक्षा के डिजाइन में संरेखित करना चाहते हैं। इसलिए यदि आपके पास प्राइम नंबर रखने के लिए पूर्णांक का सार्वजनिक वेक्टर था, तो मुझे लगता है कि "प्राइम वेक्टर" –

+0

जैसे नाम देने के लिए यह खराब फॉर्म होगा, जाहिर है कि आप इसे "वेक्टरप्रिम" कहते हैं। – JAB

+1

आपके काम के विवरण पर बहुत अधिक आधारित है। यदि, उदाहरण के लिए, हम जावा से बात कर रहे हैं, जहां वेक्टर एक प्रसिद्ध वर्ग है * और * आप जावा प्रोग्राम द्वारा उपयोग किए जाने वाले वर्ग को डिजाइन कर रहे हैं, तो मेरी प्राथमिकता यह है कि इसे "प्राइम नंबर्स" और कुछ वेक्टर टाइप करें। यदि आप एक अलग भाषा में हैं जहां आपने अपना खुद का वर्ग वेक्टर नाम दिया है, तो आपको अपने इंटरफ़ेस में उस कक्षा को भी बेनकाब करना होगा। यदि आप एक इंटरफ़ेस कर रहे हैं जो दृढ़ता से टाइप नहीं किया गया है, तो मैं इसे "प्राइम नर्सवेक्टर" कहूंगा।इसके अलावा, यदि आप एक COM इंटरफ़ेस लिख रहे हैं तो अन्य विचार भी हैं। –

1

उदाहरण चर सार्वजनिक बनाने में समस्या यह है कि आप कभी भी अपना दिमाग कभी नहीं बदल सकते हैं, और मौजूदा कोड को तोड़ने के बिना उन्हें निजी बना सकते हैं जो सीधे उन उदाहरणों के लिए सार्वजनिक पहुंच पर निर्भर करता है। कुछ उदाहरण:

  • आप बाद में वार्स, या हो सकता है प्रत्येक थ्रेड के लिए मूल्य की एक नई प्रतिलिपि बनाने के लिए एक ThreadLocal का उपयोग करके उदाहरण के इस्तेमाल के सभी सिंक्रनाइज़ करके अपनी कक्षा धागा सुरक्षित बनाने के लिए निर्णय लेते हैं। अगर कोई धागा सीधे चर का उपयोग कर सकता है तो ऐसा नहीं कर सकता है।

  • किसी वेक्टर या सरणी सूची के अपने उदाहरण का उपयोग करके - किसी बिंदु पर, आपको पता चलता है कि आपके कोड में सुरक्षा त्रुटियां हैं क्योंकि वे कक्षाएं उत्परिवर्तनीय हैं, इसलिए कोई और सूची की सामग्री को प्रतिस्थापित कर सकता है। यदि यह केवल एक्सेसर विधि के माध्यम से उपलब्ध था, तो आप अनुरोध पर सूची की एक अपरिवर्तनीय प्रति बनाकर समस्या को आसानी से हल कर सकते हैं, लेकिन आप सार्वजनिक चर के साथ ऐसा नहीं कर सकते हैं।

  • आप बाद में महसूस करते हैं कि आपके इंस्टेंस वर्रों में से एक अनावश्यक है और अन्य चर के आधार पर प्राप्त किया जा सकता है। एक बार फिर, यदि आप एक्सेसर्स का उपयोग कर रहे हैं, तो सार्वजनिक चर के साथ असंभव है।

मुझे लगता है कि यह एक व्यावहारिक बिंदु करने पर निर्भर करता है - अगर आप जानते हैं कि आप केवल एक है जो इस कोड का उपयोग किया जाएगा रहे हैं, और यह आप accessors लिखने के लिए (हर आईडीई यह तुम्हारे लिए क्या होगा दर्द स्वचालित रूप से), और यदि आप API को तोड़ने का निर्णय लेते हैं, तो इसके बाद आप अपना कोड बदलना नहीं चाहते हैं, फिर इसके लिए जाएं।लेकिन यदि अन्य लोग आपकी कक्षा का उपयोग करेंगे, या यदि आप बाद में अपने उपयोग के लिए रिफैक्टर करना आसान बनाना चाहते हैं, तो एक्सेसर्स के साथ चिपके रहें।

0

आप जिस भाषा का उपयोग कर रहे हैं उसके आधार पर आप मुद्दों में भाग ले सकते हैं और यह रिटर्न स्टेटमेंट या असाइनमेंट ऑपरेटर का कैसा व्यवहार करता है। कुछ मामलों में यह आपको अन्य मामलों में संदर्भ, या मूल्य दे सकता है।

उदाहरण के लिए, कहें कि आपके पास प्राइम कैलकुलेटर श्रेणी है जो प्रमुख संख्याओं को दर्शाती है, तो आपके पास एक और कक्षा है जो उन प्रमुख संख्याओं के साथ कुछ करती है।

public PrimeCalculator calculatorObject = new PrimeCalculator(); 

Vector<int> primeNumbers = calculatorObject.PrimeNumbersVector; 
/* do something complicated here */ 
primeNumbers.clear(); // free up some memory 

आप बाद में इस सामान का उपयोग करते हैं, संभवतः किसी अन्य वर्ग में, तुम नहीं संख्या की गणना के भूमि के ऊपर फिर से चाहते हैं ताकि आप एक ही calculatorObject का उपयोग करें।

Vector<int> primes = calculatorObject.PrimeNumbersVector; 
int tenthPrime = primes.elementAt(9); 

यह इस बिंदु पर बिल्कुल स्पष्ट नहीं हो सकता है कि प्राइम और प्राइम नब्स एक ही वेक्टर का संदर्भ देते हैं या नहीं। यदि वे करते हैं, तो प्राइम से दसवां प्राइम प्राप्त करने का प्रयास करने से एक त्रुटि फेंक जाएगी।

यदि आप सावधान हैं और समझते हैं कि आपकी स्थिति में वास्तव में क्या हो रहा है, तो आप इसे इस तरह से कर सकते हैं, लेकिन आपके पास वैरिएबल को सीधे निर्दिष्ट करने के बजाय किसी मूल्य को वापस करने के लिए फ़ंक्शंस का उपयोग करके त्रुटि का एक छोटा सा मार्जिन है।

0

वैसे आप जाँच कर सकते हैं पोस्ट:

first this

then this

यह आपके भ्रम का समाधान करना चाहिए। यह मेरा हल हो गया! Nicol Bolas के लिए धन्यवाद।

भी स्वीकार किए जाते हैं जवाब (भी (मेरे द्वारा दूसरा पिछले टिप्पणी में दिए गए लिंक पहली पोस्ट में नोटिस))

नीचे टिप्पणी को पढ़ने के अलावा the wikipedia post

संबंधित मुद्दे