सवाल रेल में संरक्षित और निजी तरीके


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

संपादित करें: अब तक उत्तर देते रहने के लिए धन्यवाद। मैं रुबी में संरक्षित और निजी की अवधारणा को समझता हूं, लेकिन मैं एक सामान्य तरीके से स्पष्टीकरण के लिए और अधिक देख रहा हूं कि उन प्रकार की दृश्यता का उपयोग रेल ऐप (मॉडल, नियंत्रक, सहायक, परीक्षण) के विभिन्न टुकड़ों के संदर्भ में किया जाता है। । उदाहरण के लिए, सार्वजनिक नियंत्रक विधियां क्रिया विधियां हैं, एप्लिकेशन नियंत्रक में संरक्षित विधियों का उपयोग "सहायक विधियों" के लिए किया जाता है जिन्हें एकाधिक नियंत्रकों द्वारा एक्सेस किया जाना आवश्यक है।


76
2017-12-20 23:45


मूल




जवाब:


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

यह अन्य ऑब्जेक्ट उन्मुख भाषाओं में भी वही अभ्यास है।

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

परिशिष्ट / सुधार: नियंत्रकों के लिए, आपको "सहायक" विधियों को चिह्नित करना चाहिए संरक्षित निजी, और केवल कार्य ही सार्वजनिक होना चाहिए। ढांचा किसी भी आने वाली HTTP कॉल को उन कार्रवाइयों / विधियों पर कभी भी रूट नहीं करेगा जो सार्वजनिक नहीं हैं, इसलिए आपके सहायक तरीकों को इस तरह से संरक्षित किया जाना चाहिए।

मददगार के लिए यदि कोई विधि सुरक्षित या निजी है, तो इससे कोई फर्क नहीं पड़ता है, क्योंकि उन्हें हमेशा "सीधे" कहा जाता है।

आप उन सभी मामलों में संरक्षित सामानों को चिह्नित कर सकते हैं यदि यह आपके लिए समझने के लिए चीजों को आसान बनाता है।


97
2018-01-05 17:47



"नियंत्रकों के लिए, आपको "सहायक" विधियों को संरक्षित के रूप में चिह्नित करना चाहिए, और केवल कार्य ही स्वयं सार्वजनिक होना चाहिए।"क्या आप सलाह देते हैं कि नियंत्रकों में कोई निजी तरीका न हो? या क्या मुझे सचमुच पढ़ना नहीं चाहिए? - Dennis
आजकल मैं केवल निजी का उपयोग करता हूं। संरक्षित और निजी ज्यादातर स्थानों में एक दूसरे के लिए उपयोग किया जाता है; लेकिन संरक्षित एक अजीब व्यवहार लाता है जिसे मुझे असली दुनिया में कभी आवश्यकता नहीं थी। - averell
मैं केवल निजी का उपयोग करता हूं। यह कुछ दिशानिर्देशों का भी पालन करता है, जैसे कि थॉटबॉट का "नियंत्रक विधियों को परिभाषित करते समय सुरक्षित के बजाय निजी का उपयोग करें।" - Dennis


यदि आप चाहें तो एक निजी विधि का उपयोग करें लेकिन कोई और नहीं self एक विधि का उपयोग करने के लिए। यदि आप केवल कुछ चाहते हैं तो आप एक संरक्षित विधि का उपयोग करें self and is_a?(self) एस कॉल कर सकते हैं

संरक्षित का एक अच्छा उपयोग हो सकता है यदि आपके पास "वर्चुअल" प्रारंभिक विधि थी।

class Base
    def initialize()
        set_defaults()
        #other stuff
    end

    protected
    def set_defaults()
        # defaults for this type
        @foo = 7
        calculate_and_set_baz()
    end

    private
    def calculate_and_set_baz()
        @baz = "Something that only base classes have like a file handle or resource"
    end
end

class Derived < Base
    protected
    def set_defaults()
        @foo = 13
    end
end

@ फ़ू के पास अलग-अलग मान होंगे। और व्युत्पन्न उदाहरणों में @baz नहीं होगा

अद्यतन करें: चूंकि मैंने यह लिखा है, रूबी 2.0+ में कुछ चीजें बदल गई हैं, हारून पैटरसन के पास एक उत्कृष्ट लेखन है http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html


60
2017-12-21 00:08



प्यार तुमने कैसे कहा self and is_a?(self)। मैंने बच्चों की कक्षाओं में उपलब्ध होने के रूप में संरक्षित तरीकों को हमेशा समझाया है। - Tate Johnson
यहां ध्यान दें! यह अन्य भाषाओं के लिए एक महत्वपूर्ण अंतर है: निजी तरीके हैं भी बाल कक्षाओं में उपलब्ध है। निजी और संरक्षित में एकमात्र अंतर यह है कि आप संरक्षित तरीकों को "self.set_defaults" के साथ कॉल कर सकते हैं, जबकि निजी विधियों को केवल "set_defaults" के रूप में जाना जा सकता है। - averell
एक अच्छा जवाब है, लेकिन इसमें शब्द शब्द भी शामिल नहीं है जो प्रश्न का बिंदु है - Bryan Ash
अपने प्रश्न के संपादन समय टिकट पर ध्यान दें। भविष्य में मैं अपने उत्तरों को अपडेट करने के लिए एक निजी विधि परिभाषित कर दूंगा क्योंकि वे अपने प्रश्न बदलते हैं :) - EnabrenTane
जैसा कि एवरेल ने कहा, यह स्पष्टीकरण रूबी पर लागू नहीं होता है। जहां बाल वर्गों में निजी तरीके भी दिखाई दे रहे हैं। - Miguel


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

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility


9
2017-12-20 23:54



लिंक के लिए धन्यवाद। लेकिन मैं इस बारे में और सोच रहा हूं कि यह काम विशेष रूप से रूबी पर रूबी में कैसे होता है (सार्वजनिक नियंत्रक विधियों को क्रिया विधियों के रूप में माना जाता है, एप्लिकेशन नियंत्रक में संरक्षित विधियों को अन्य नियंत्रकों द्वारा उपयोग किया जा सकता है आदि) - jrdioko
अंतिम मामले में "एप्लिकेशन नियंत्रक में संरक्षित विधियों का उपयोग अन्य नियंत्रकों द्वारा किया जा सकता है" ऐसा इसलिए है क्योंकि अन्य नियंत्रक (आमतौर पर) से उत्तराधिकारी ApplicationController ताकि वे वास्तव में उन सभी विधियों के मालिक हैं। वे application_controller से उन्हें एक्सेस नहीं कर रहे हैं: यह कभी भी तत्काल नहीं मिलता है। यह विशेषाधिकार के रूप में विशेषाधिकार के रूप में उपयोग किया जाता है। - Max Williams


आपको विधियों के लिए लागू क्लास दृश्यता (सार्वजनिक / संरक्षित / निजी) के अर्थशास्त्र का अच्छा विचार प्रतीत होता है। मैं जो कुछ भी ऑफर कर सकता हूं वह है कि मैं अपने रेल ऐप्स में इसे लागू करने के तरीके की एक त्वरित रूपरेखा है।

मैं बेस एप्लिकेशन नियंत्रक में संरक्षित विधियों को लागू करता हूं ताकि उन्हें फ़िल्टर के माध्यम से किसी भी नियंत्रक द्वारा कॉल किया जा सके (उदा। पहले_फिल्टर: method_foo)। इसी तरह, मैं उन मॉडलों के लिए संरक्षित विधियों को परिभाषित करता हूं जिन्हें मैं उन सभी में मूल मॉडल में उपयोग करना चाहता हूं, जिनसे वे सभी प्राप्त होते हैं।


3
2018-01-04 07:09





यद्यपि कार्यों को नियंत्रक के सार्वजनिक तरीकों की आवश्यकता होती है, लेकिन सभी सार्वजनिक विधियां जरूरी नहीं हैं। आप उपयोग कर सकते हैं hide_action यदि आप कैच-ऑल रूट जैसे उपयोग कर रहे हैं /:controller/:action/:id या यदि यह अक्षम है (रेल 3 में डिफ़ॉल्ट) तो स्पष्ट मार्गों के साथ केवल विधियों को बुलाया जाएगा।

यह उपयोगी हो सकता है यदि आप कुछ अन्य लाइब्रेरी में लिक्विड टेम्पलेट इंजन जैसे नियंत्रक उदाहरण पास कर रहे हैं क्योंकि आप अपने तरल फ़िल्टर और टैग में भेजने के बजाय सार्वजनिक इंटरफ़ेस प्रदान कर सकते हैं।


2
2018-01-07 11:36