रूबी में निजी तरीके कहां रखें?


95

अधिकांश ब्लॉग या ट्यूटोरियल या पुस्तकों में किसी भी वर्ग / मॉड्यूल के तल पर निजी तरीके हैं। क्या यह सबसे अच्छा अभ्यास है?

मुझे लगता है कि जब आवश्यक हो और अधिक सुविधाजनक निजी तरीके हो। उदाहरण के लिए:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

इस तरह मुझे लगातार और ऊपर स्क्रॉल करने के बजाय कोड अधिक पठनीय लगता है जो बहुत परेशान करता है।

क्या इस दृष्टिकोण में कुछ गलत है? तल पर निजी तरीके सिर्फ एक सबसे अच्छा अभ्यास और कुछ और नहीं है?


वास्तव में आपका रास्ता बुरा नहीं है। मैं भी कुछ ही मामलों में उसी का पालन करता हूं, यह अधिक सुविधाजनक लगता हैprivate def my_method...end
r3bo0t

जवाबों:


131

मेरे दृष्टिकोण में सबसे अच्छा अभ्यास क्रमिक रूप से जाना है और निजी तरीकों को ध्यान में रखे बिना अपने तरीकों की घोषणा करना है।

अंत में, आप किसी भी विधि को केवल जोड़कर निजी बना सकते हैं: private :xmethod

उदाहरण:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

क्या यह आपके सवाल को सही ठहराता है?


19
मुझे नहीं लगता कि यह पठनीयता के दृष्टिकोण से एक महान विचार है क्योंकि वर्ग लंबे और लंबे समय तक बढ़ता है।
अलेक्जेंडर सुरफेल

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

58

privateरूबी 2.1 के बाद से विधि की परिभाषा को प्रस्तुत करने का विकल्प भी है ।

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

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


5
आपको ध्यान देना चाहिए, कि यह रूबी 2.1 में उपलब्ध है, जहां विधियाँ अपने नाम के साथ कुंजी लौटाती हैं
konole

मेरा मानना ​​है कि निजी को एक ब्लॉक के रूप में भी इस्तेमाल किया जा सकता है, उर्फ ​​निजी शुरुआत में कुछ निजी तरीकों को
घेरना

वर्ग विधियों के साथ ऐसा करने के बारे में नोट के लिए @devpuppy का उत्तर यहां देखें ।
मैनरो

privateकेवल एक बार जोड़ने से पहले ymethod, यह भी काम करता है। इसे कई बार जोड़ने की आवश्यकता नहीं है।
इयूलियन ओनोफ्रेई

@IulianOnofrei आप नीचे दिए गए किसी अन्य विधि का था, तो zmethodबिना private, इस विधि निजी नहीं होगा। तो, आपको इसे दोहराने की जरूरत है (कम से कम रूबी 2.3 के साथ)।
tsauerwein

52

जैसा कि अन्य लोग पहले ही बता चुके हैं कि सम्मेलन एक निजी वर्ग के तहत निजी विधियों को सबसे नीचे रखना है। हालांकि, आपको शायद यह भी पता होना चाहिए कि कई प्रोग्रामर इसके लिए एक डबल इंडेंट (2 के बजाय 4 स्पेस) विधि का उपयोग करते हैं। कारण यह है कि कई बार आप अपने पाठ संपादक में "निजी" नहीं देखेंगे और मान लें कि वे सार्वजनिक हो सकते हैं। चित्रण के लिए नीचे देखें:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

इस विधि को आपको ऊपर और नीचे स्क्रॉल करने से रोकना चाहिए और अन्य प्रोग्रामर को आपके कोड में अधिक आरामदायक बना देगा।


4
यह सब क्रोध था जब मैंने इस टिप्पणी को '12 में वापस छोड़ दिया। मैं इसे बहुत बार नहीं देखता हूं और यह एहसान से गिर गया है।
नूह क्लार्क

निजीकरण को इसके begin..endठीक बाद प्रारूपित किया जा सकता है private। तब इंडेंटेशन को संपादक द्वारा स्वचालित रूप से सेट किया जा सकता है क्योंकि कोड अंदर beginहै (ऊपर उदाहरण में) 4 रिक्त स्थान के साथ शब्दार्थ।
पेट्रस रेपो

मैं उसी दृष्टिकोण का पालन करता हूं ... पहले publicऔर फिरprivate
राहुल गोयल

1
मैंने कभी इसे नहीं देखा है और मैं 2007 से रूबी के साथ काम कर रहा हूं। मैं आमतौर पर इसकी सिफारिश नहीं करता।
मार्नेन लाइबो-कोसर

15

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


5
हां, उन सार्वजनिक तरीकों को रखें जहां आप उन्हें ढूंढने की सबसे अधिक संभावना रखते हैं, आम तौर पर फ़ाइल के शीर्ष के पास, और जिन चीजों को आप शायद नहीं देख रहे हैं उन्हें नीचे के पास दफन किया जाना चाहिए। जैसे अखबार का लेख लिखा जाता है, सबसे महत्वपूर्ण चीजें पहले रखें।
tadman

14

आपको प्रत्येक विधि डालने publicया privateउससे ऊपर जाने की आवश्यकता नहीं है । मैं आमतौर पर अपने सभी निजी तरीकों को अपनी कक्षा में सबसे नीचे रखता हूं। इसके अलावा, स्पष्ट रूप से यह कहने की ज़रूरत नहीं है कि publicतरीके डिफ़ॉल्ट रूप से सार्वजनिक हैं। उदाहरण के लिए:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

कृपया मेरे प्रश्न को फिर से पढ़ें। इसे संपादित करने के लिए और अधिक विशिष्ट होना चाहिए
ZX12R

1
यह किसी भी चीज से ज्यादा एक कन्वेंशन है। आप जो कर रहे हैं वह मान्य है और अगर यह आपके लिए अधिक मायने रखता है तो आपको इसके साथ रहना चाहिए। मुझे लगता है कि अधिवेशन अधिक पठनीय होगा, लेकिन शायद इसलिए कि मुझे इसे लिखना सिखाया गया था इसलिए मुझे इसका उपयोग करने की आदत है।
काइल डिकोट

"सार्वजनिक" के रूप में एक विधि घोषित करने का वास्तव में क्या मतलब है / करते हैं?
ZX12R

6

मैं जावा बैकग्राउंड से आ रहा हूं और मुझे मेथड टाइप देखने के लिए स्क्रॉल करने से नफरत है। मुझे लगता है कि यह पागलपन है कि कोई भी बिना कुरूपता के प्रति विधि दृश्यता को निर्दिष्ट नहीं कर सकता है। इसलिए मैंने #privateप्रत्येक चूसना विधि से पहले एक टिप्पणी डालना और फिर घोषणा करना समाप्त कर दिया private :...


1
और हाल ही में रूबी private def method...ने इसे ठीक
ठाक

5

मुझे प्रत्येक विधि के लिए सार्वजनिक या निजी निर्दिष्ट करना पसंद नहीं है। नीचे सभी निजी तरीकों को रखने से मुझे प्रति फ़ाइल "निजी" का एक ही उदाहरण मिलता है। मुझे लगता है कि यह स्वाद की बात है।


5

एक शैली समूह विधियों को एक साथ करना है ताकि आप केवल कक्षा में privateऔर protectedएक बार अधिकतम उपयोग करें । एक और शैली विधि परिभाषा के ठीक बाद दृश्यता निर्दिष्ट करने के लिए है:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

रूबी 2.1.0 के defरूप में एक प्रतीक के रूप में विधि का नाम देता है, इसलिए एक अधिक सुव्यवस्थित शैली संभव है:

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(नोट हम का उपयोग करें कि private_class_methodवर्ग तरीकों के लिए - अन्यथा हम मिल चाहते हैं NameError: undefined methodके बाद से privateउम्मीद एक उदाहरण विधि यहां तक कि जब एक मैक्रो के रूप में उपयोग यह केवल उदाहरण के तरीकों की दृश्यता को प्रभावित करता है मूल उदाहरण की तरह।।)

मुझे यह इनलाइन दृश्यता शैली सबसे अच्छी लगती है, क्योंकि यह आपको इच्छानुसार तरीकों को व्यवस्थित करने की अनुमति देता है। यह गलत जगह एक नई विधि को जोड़ने और अनजाने में इसे निजी बनाने के जोखिम को कम करता है।

वर्ग विधि सिंटैक्स के रूप में, आप इसे इस तरह से संभाल सकते हैं:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

यह एकमात्र जगह है जिसे मैंने private_class_methodपहले कॉल का उल्लेख किया है , और इसका उपयोग class << selfकरने की आवश्यकता से बचने के लिए ब्लॉक का उपयोग करने के बारे में अंतिम भाग एक अच्छा टिप है। अब तक, मुझे नहीं पता था कि "नॉर्नल" क्लास के तरीके ( def self.foo; endइसके बजाय घोषित से class << self; def foo; endप्रभावित नहीं होंगे जो private
स्पेसियर से

3

डेनिस के पास सही जवाब था, यानी रूबी> = 2.1 का उपयोग करते समय, बस निजी (या संरक्षित, सार्वजनिक) के साथ दोष का उपसर्ग करें

लेकिन मेरा मानना ​​है कि अब निजी का उपयोग ब्लॉक के रूप में करना संभव है:

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0

मैं आमतौर पर अपने तरीकों का आदेश देता हूं:

  1. निर्माता
  2. अन्य सार्वजनिक विधियाँ, वर्णमाला क्रम में
  3. privateकेवल एक बार लिखा है
  4. निजी विधियाँ, वर्णमाला क्रम में

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


मुझे यह भी उल्लेख करना चाहिए कि मैं आमतौर पर to_sसार्वजनिक अनुभाग के अंत के पास रूपांतरण विधियाँ (जैसे ) डाल देता हूं ।
मार्नेन लाईबो-कोसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.