2011-01-28 8 views
10

(StackOverflow कह रहा है कि इस सवाल का "व्यक्तिपरक और बंद होने की संभावना" है ... अच्छी तरह से, मैं इसे एक शॉट परवाह किए बिना दे देंगे)रुबी में नामस्थान कार्यों के लिए सर्वश्रेष्ठ अभ्यास? (नौसिखिया सवाल)

मैं सहायक तरीकों में से एक गुच्छा लिख ​​रहा हूँ (टेक्स्टमैट बंडल के लिए), और मैं उन्हें अच्छी तरह से नामित रखने के लिए (और मुझे चाहिए) चाहूंगा।

ये विधियां वास्तव में केवल कार्य हैं, यानी वे अपने दायरे से बाहर किसी भी चीज़ पर काम नहीं करते हैं, और इस प्रकार वास्तव में कक्षा में नहीं हैं। ऐसा कुछ भी नहीं है जिसके लिए तत्काल आवश्यकता है।

अब तक, मैं यह कर दिया गया है और कहा कि ठीक

module Helpers::Foo 
    module_function 
    def bar 
     # ... 
    end 
end 
Helpers::Foo.bar # this is how I'd like to call the method/function 

काम करता है लेकिन यह बेहतर होगा:
1. छोड़ें module_function और self.* तरीके के रूप में/कार्य की घोषणा?
2. या मॉड्यूल के बजाय कक्षा घोषित करना बेहतर होगा?
3. या class << self (मॉड्यूल या कक्षा के अंदर) का उपयोग करें?
4. या कुछ और पूरी तरह से?

मुझे एहसास है कि यह एक सुंदर खुला-अंत प्रश्न है, लेकिन मैं वास्तव में यह सुन रहा हूं कि लोग क्या कर रहे हैं।

उत्तर

8

मैं या तो

module Foo 
    def self.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

या

module Foo 
    def Foo.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

लेकिन शायद पूर्व की ओर झुक, मुझे लगता है कि वास्तव में self. वर्णनात्मक है पसंद करते हैं।

संपादित करें: टिप्पणियां पढ़ने के बाद मैं एक तीसरा विकल्प प्रस्तावित करता हूं जिसे मैं पठनीयता के लिए पसंद करता हूं। तकनीकी रूप से मुझे लगता है कि इसे ईजिन वर्ग में शामिल विधियों को विस्तारित करने के रूप में परिभाषित किया जाएगा।

module Foo 
    module ClassMethods 
    def baz 
     "baz" 
    end 
    end 
    extend ClassMethods 
end 

Foo.baz #=> "baz" 
+0

पूर्व, उर्फ ​​स्वयं के लिए +1। –

+2

अच्छा बिंदु। लेकिन मुझे डर है कि 'स्वयं' 'मेरे कोड में इसका महत्व खो जाएगा, क्योंकि व्यावहारिक रूप से सब कुछ एक मॉड्यूल है जिसमें सहायक काम नहीं है। तो _everything_ को 'self.' के रूप में परिभाषित किया जाएगा - इस मामले में मैं कुछ भी' स्वयं 'के रूप में परिभाषित नहीं कर सकता हूं और इसके बजाय 'module_function' का उपयोग कर सकता हूं। – Flambino

+0

मैं देखता हूं, मैं इस स्थिति के लिए एक तीसरा विकल्प शामिल करने के लिए उत्तर अपडेट कर दूंगा। –

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