2012-01-04 10 views
10

बस सोच रहा है, मॉडल में कुछ तरीकों के लिए हमें वास्तव में private या protected का उपयोग करना चाहिए?हमें निजी या संरक्षित का उपयोग कब करना चाहिए?

कभी-कभी मुझे private और protected में मेरी विधियों को समूहित करने के लिए परेशान नहीं किया जा सकता है। मैं बस इसे छोड़ देता हूं। लेकिन मुझे पता है कि यह एक बुरा अभ्यास होना चाहिए, अन्यथा ये 2 समूह प्रोग्रामिंग में नहीं बनाए जाएंगे।

धन्यवाद।

उत्तर

15
  • क्या आप वह आंतरिक रूप से उपयोग करना चाहते हैं एक विधि बाह्य record.method(), तो "सार्वजनिक"
  • कॉल करने के लिए, यह केवल आंतरिक रूप से उपयोग किया जाएगा, self.method(), तो "निजी"
  • योजना है, लेकिन भी वंश में, self.method() # in subclass, फिर "संरक्षित"
+2

यह मेरे लिए थोड़ा सा लगता है ... आपका ** तीसरा बिंदु **। एक उप-वर्ग आंतरिक रूप से अपने सुपरक्लास के 'निजी' तरीकों तक पहुंच सकता है। एक 'संरक्षित' विधि आपको उसी वर्ग के किसी ऑब्जेक्ट में पास करने और उस ऑब्जेक्ट पर संरक्षित विधियों को निष्पादित करने की क्षमता प्रदान करती है। – slindsey3000

+0

http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby "संरक्षित विधियों को वास्तव में कभी भी कहा जा सकता है जब रिसीवर एक ही वर्ग के 'स्वयं' के रूप में होता है" – clyfe

0

मैं एक विशेष मामले के रूप रूबी पता नहीं है, लेकिन मुझे लगता है इस सवाल का जवाब भी अन्य भाषाओं के लिए के रूप में ही हो सकता है, इसलिए यहाँ यह है:

एक निजी विधि केवल के सदस्यों द्वारा पहुँचा जा सकता है एक ही कक्षा, जबकि संरक्षित वर्गों के सदस्य के लिए भी संरक्षित है जो आधार वर्ग का विस्तार करते हैं जहां विधि घोषित की जाती है।

+0

युप, यह एक सामान्य प्रोग्रामिंग प्रश्न है। मैंने पढ़ा है कि 'निजी' और 'संरक्षित' क्या करता है, लेकिन हमें इसे कब अनदेखा नहीं करना चाहिए? – Victor

+0

क्या आपका मतलब यह मामला है, जहां एक विधि सार्वजनिक, निजी या संरक्षित के रूप में घोषित नहीं की जाती है? – fkerber

+0

@ विक्टर आप encapsulation 'अनदेखा' नहीं करते हैं, लेकिन आम तौर पर बोलते हुए चीजें 'निजी' रखते हैं जब तक उनके लिए 'संरक्षित' या 'सार्वजनिक' –

2

मैं अपने राय दे देंगे, और शायद मैं इसके लिए एक लात मिलेगा, लेकिन मैं से परेशान नहीं है संरक्षित या रूबी में निजी। हकीकत यह है कि, रूबी आपको वयस्क की तरह व्यवहार करती है, अगर आप कक्षा से बाहर एक निजी विधि चलाने के लिए चाहते हैं, तो आप (areways) कर सकते हैं। आप कक्षा के बाहर संरक्षित तरीकों को चला सकते हैं। आप स्थिरांक को फिर से सौंप सकते हैं ... मूल रूप से आप जो भी चाहें कर सकते हैं।

और यही कारण है कि मुझे यह पसंद है, यह आपकी ज़िम्मेदारी है।

  1. का संकेत आपको नहीं लगता कि कि एक उपभोक्ता की आवश्यकता होगी: मेरा लग रहा है कि के रूप में संरक्षित या निजी आपको दो बातें कर रहे हैं कुछ चिह्नित करने के लिए, है।
  2. दूसरा अनुमान लगाता है कि किसी और को क्या चाहिए।

और इसके अलावा, आप इसे कठिन परीक्षण करने के लिए कर रहे हैं, के रूप में यह निजी तरीकों का परीक्षण एक असली दर्द हो सकता है

उन पिछले दो कारणों के लिए (इसके चारों ओर तरीकों की What's the best way to unit test protected & private methods in Ruby? देखें), मैं ' उनके साथ परेशान नहीं है। यदि आप वास्तव में अपने वर्ग/विधियों और उपभोक्ताओं (चाहे वे कोड या डेवलपर हों) के बीच किसी प्रकार की बाधा चाहते हैं तो अन्य, अधिक प्रभावी तरीके हैं (प्रॉक्सी, obfuscation, एन्क्रिप्शन, पासवर्ड संरक्षित विधियों आदि)। अन्यथा, उन्हें आपके द्वारा उपयोग किए जाने वाले उसी टूल तक क्यों न पहुंचें?

+1

+1 मेरे पास है समान विचार एकमात्र कारण ** ** ** इसका उपयोग क्यों करता है: rdoc में विकल्प '- विज़िबिलिटी' है। सार्वजनिक, संरक्षित और निजी के साथ मैं दस्तावेज के विभिन्न संस्करणों को कम या ज्यादा विवरण के साथ उत्पन्न कर सकता हूं। – knut

+0

@knut यह एक दिलचस्प विचार है, मुझे इसे ध्यान में रखना होगा। मैं यार्डोक का उपयोग करता हूं और इसमें '@ निजी' टैग है, लेकिन मैंने कभी नहीं देखा होगा कि इसका क्या उपयोग हो सकता है। धन्यवाद। – iain

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