2009-05-22 18 views
14

कन्फेशंस: मैं केवल निजी और सार्वजनिक मेरी विधियों के लिए दृश्यता का उपयोग करता हूं!क्या आपने कभी रेल में संरक्षित दृश्यता का उपयोग किया है?

मुझे एहसास है कि यह एक बुरी बात है। लेकिन रेल में यह सिर्फ एक मुद्दा के रूप में नहीं लग रहा है।

क्या किसी के पास रेल में एक उदाहरण है जहां सुरक्षित दृश्यता का उपयोग न करने की एक बड़ी गलती होगी?

उत्तर

9

अद्यतन - कृपया true explanation of protected/private in Ruby पर लिंक के नीचे दी गई टिप्पणी देखें। यह वास्तव में मेरे जावा दिनों से एक गहरी बैठे पूर्वाग्रह था। मेरे उत्तर में एकमात्र महत्वपूर्ण हिस्सा यह है कि नियंत्रक विधियां जो क्रियाएं नहीं हैं public नहीं होनी चाहिए (या कम से कम आपके मार्गों को उनकी रक्षा करनी चाहिए)।

एकल तालिका विरासत मॉडल टियर में protected सहायक उपकरण का एक आदर्श उदाहरण है, क्योंकि यह वहां विरासत के सबसे आम उपयोगों में से एक है।

नियंत्रक स्तरीय में, ApplicationController पर परिभाषित सहायक तरीकों protected के रूप में चिह्नित किया जाना चाहिए - अगर वे private थे अन्य नियंत्रकों द्वारा पहुंच बनाने के लिए सक्षम नहीं होगा, लेकिन अगर वे कर रहे हैं public रेल को गतिविधियों के रूप में व्यवहार करेगा।

व्यक्तिगत रूप से, मुझे लगता है कि मैं रेल अनुप्रयोगों में भी अपने कई मित्रों और सहकर्मियों से अधिक कक्षा विरासत का उपयोग करता हूं। क्योंकि मैं अक्सर इसका उपयोग करता हूं (और मेरे जावा दिनों से बाहर आ रहा हूं), मैं सभी सहायक तरीकों के लिए protected का समर्थन करता हूं (आमतौर पर स्वयं) जो कक्षा को विस्तारित करना चाहता है - जब तक कि मैं वास्तव में वास्तव में शर्मिंदा नहीं हूं, तब तक मैं इसे private चिह्नित करता हूं। :)

+0

इससे बहुत समझदारी होती है। (यकीन नहीं है कि एसटीआई क्या है)। –

+3

"एप्लिकेशन नियंत्रक पर परिभाषित सहायक विधियों को संरक्षित के रूप में चिह्नित किया जाना चाहिए - यदि वे निजी थे तो अन्य नियंत्रक उन्हें एक्सेस नहीं कर पाएंगे" - fyi, यह गलत है। उदाहरण यहां देखें: http://pastie.org/842898। रुबी में संरक्षित/निजी 'आत्म' और रिसीवर के बारे में है, विरासत नहीं। "ध्यान दें कि, जावा जैसी भाषाओं के विपरीत, विरासत रूबी में विधि दृश्यता निर्धारित करने में बिल्कुल कोई भूमिका नहीं निभाती है।" - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

धन्यवाद, जॉर्डन। आप सही हे। मैंने थोड़ा नोट जोड़ा है। –

0

मैं SingleTableInheritance है

वर्ग व्यक्ति < एआर :: आधार वर्ग शिक्षक < व्यक्ति calss छात्र < व्यक्ति

और मैं संरक्षित तरीकों का उपयोग एक निजी विधि छात्र और शिक्षक के लिए आम है कि लागू करने के लिए :

class Person < AR::base 
    def self.find(*args) 
    reject_leaves(super(*args)) 
    end 
protected 
    def self.reject_leaves(target) #like a private in Teacher and Student 
    case target 
     when Array target.select{|t| reject_leaves(t)} 
     when Person (target.leave_date < Date.today ? target : nil) 
     else target 
    end 
    end 
end 

अस्वीकरण: फीचर जैसे एक्ट-ए-पैरानोइड और अन्य सुविधा को लागू करने के लिए प्लगइन हैं मैं आपको केस दिखाने के लिए यहां उपयोग करता हूं लेकिन मेरे पास एक जटिल परिदृश्य है, मैंने आपके बिंदु पर जाने के लिए यहां सरल बना दिया है।

+0

fyi, उपरोक्त आपका उदाहरण सही तरीके से काम नहीं करता है - आप बिना किसी समस्या के 'Person.reject_leaves (...) 'को कॉल कर सकते हैं। रूबी में 'सार्वजनिक/संरक्षित/निजी' कीवर्ड नहीं हैं - वे 'स्वयं' पर विधि आमंत्रण हैं जो 'स्वयं' की स्थिति को संशोधित करते हैं। चूंकि आप स्वयं को 'स्वयं' करते हैं, तो आप 'स्वयं' क्या बदलते हैं। अस्वीकार करें 'अब आपके पास' संरक्षित 'राज्य स्थापित नहीं है। जो भी आप चाहते हैं उसे पाने के लिए आपको दूसरे उदाहरण ('Prot2') की तरह कुछ चाहिए: http://pastie.org/842952 –