2010-08-27 10 views
22

मेरे पास रेल में एक और वैचारिक सवाल है ... या उस मामले के लिए रूबी:रेल में "आवश्यकता" कहां कॉल करें?

क्या यह आवश्यक तरीके से पहले एक आवश्यकता को कॉल करना सबसे अच्छा है, मुझे कक्षा की शुरुआत में या कहीं भी समूह की आवश्यकता है एक प्रारंभिक जब रेल बूट करता है?

क्या यह प्रदर्शन के दृष्टिकोण से महत्वपूर्ण है? एक पठनीयता दृष्टिकोण से? यदि मैं रेल 3 का उपयोग कर रहा हूं तो क्या इससे कोई फर्क पड़ता है?

धन्यवाद!

उत्तर

19

यदि आप प्रदर्शन के बारे में चिंतित हैं तो आपको उन चीजों के संदर्भ में चीजों की आवश्यकता होनी चाहिए जहां उनकी आवश्यकता है ताकि यदि आपके कोड का वह हिस्सा उपयोग नहीं किया जाता है, तो लाइब्रेरी लोड नहीं होती है। require पर आने वाली किसी भी कॉल का कोई प्रभाव नहीं पड़ता है क्योंकि वह फ़ाइल पहले ही लोड हो चुकी है। यह की तर्ज पर कुछ की तरह लग रही समाप्त होता है:

if (user.using_openid?) 
    require 'openid' 

    # ... Do OpenID stuff 
end 

हालांकि यह संसाधनों के संदर्भ में और अधिक कुशल है, यह बहुत मुश्किल अपने आवेदन की निर्भरता निर्धारित करने के लिए कर सकते हैं। इन अप-फ्रंट को घोषित करने से सॉफ्टवेयर को बनाए रखने वाले अन्य लोगों को यह स्पष्ट हो जाता है। ध्यान रखें कि "अन्य लोगों" में हमेशा आपके भविष्य के आत्म शामिल होते हैं जब आप अपने आवेदन के कुछ विवरण भूल गए हैं।

आपको तकनीकी रूप से देर से या जल्दी किसी भी समय किसी भी चीज़ की आवश्यकता होने की अनुमति है, लेकिन आपकी आवश्यकताओं को सामने की ओर एक डिजाइन परिप्रेक्ष्य से बेहतर है। यदि आपको लगता है कि एक ऐसा तत्व है जिसका उपयोग केवल अंतःक्रियात्मक रूप से किया जाता है और लोड करने के लिए असामान्य मात्रा या स्मृति लेता है, तो आपको शायद अपनी आवश्यकताओं की फ़ाइल में आगे बढ़ाना चाहिए। उदाहरण के लिए:

require 'library1' 
require 'library2' 
require 'library3' 
require 'library4' 
require 'library5' 

# Other libraries loaded as required: 
# * slowimagelibrary 
# * slowencryptionlibrary 
# * openid 

यकीनन यह है क्योंकि आप अपने जवाहरात सामने अधिक औपचारिक रूप से अप घोषित हो सकता है और वास्तविक require कॉल बाद में आ सकते हैं bundler साथ कोई समस्या नहीं रह जाती है।

+2

धन्यवाद टैडमैन, यह जो मैं सोच रहा था उसके अनुरूप है। निष्कर्ष: भारी आवश्यकता का उपयोग करते समय पठनीयता प्रदर्शन से अधिक महत्वपूर्ण है। – Cimm

4

यदि आप वेनिला रूबी पर विचार करते हैं, तो 'आवश्यकता' ज्यादातर पहली पंक्तियों में उपयोग की जाती है, क्योंकि आप सुनिश्चित हैं कि आपके पास आवश्यकतानुसार पहुंच है, और आपको जो निर्भरता चाहिए उसे ढूंढना और पढ़ना आसान है।

कुछ मामले हैं जब आप केवल एक विधि में एक मणि लोड करना चाहते हैं, क्योंकि आपकी स्क्रिप्ट के लिए यह वास्तव में आवश्यक नहीं है (उदाहरण: एक वैकल्पिक विज़ुअलाइजेशन)।

रेल के साथ, मुझे विश्वास है कि यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं।

यदि आप बंडलर का उपयोग करते हैं, तो आप मान सकते हैं कि आपका मणि 'आवश्यक' है (आप निश्चित रूप से आवश्यक विकल्प के साथ ओवरराइड कर सकते हैं)।

यदि यह कुछ सामान है जो सर्वर प्रारंभ होने पर स्वत: लोड करना चाहते हैं (जैसे वैधकर्ता या फॉर्म बिल्डर्स), तो आपको कॉन्फ़िगर (autoload_paths और eager_load_paths) के साथ कैसे करना चाहिए, देखना चाहिए।

आवश्यकताएं भी एक मणि के केवल एक हिस्से को लोड करने के लिए उपयोग की जा सकती हैं, जैसे विस्तार। फिर यह निश्चित रूप से आवश्यक है जहां कॉन्फ़िगरेशन है।

यदि आप बहु-थ्रेडेड वातावरण में काम करते हैं तो आप चिंतित हो सकते हैं, क्योंकि उनमें कुछ समस्याएं हैं। तब आपको यह सुनिश्चित करना होगा कि आपके थ्रेड चलने से पहले सब कुछ लोड हो। (कक्षा निरंतर की तरह कुछ लोड हो गया है, लेकिन विधियों अभी तक नहीं, एक अच्छा लेख था लेकिन मुझे अब यह नहीं मिल रहा है)।

आप {मॉड्यूल, कर्नेल} भी आजमा सकते हैं।ऑटोलोड, रेल का उपयोग बड़े पैमाने पर लोड करने के लिए किया जाता है जब एक्सेस किया जाता है (लेकिन यह बदसूरत दिखता है)।

आप इसे स्वयं को const_missing के साथ भी हैक कर सकते हैं (इसलिए यदि आप संरचना स्वीकार करते हैं तो यह सादा आलसी लोडिंग कर सकता है)। यह एक साधारण उदाहरण है (नेस्टेड कक्षाओं के लिए उपयुक्त नहीं होगा)।

def Object.const_missing c 
    if (file = Dir["#{c.downcase}.rb"]).size == 1 
    require_relative(file) 
    end 
    if const_defined? c 
    const_get c 
    else 
    super # Object < Module 
    end 
end 

प्रदर्शन के बारे में, की आवश्यकता होती है के लिए एक कॉल अपेक्षाकृत महंगा है, इसलिए यदि आप जानते हैं कि आप इसका इस्तेमाल करने जा रहे हैं, यह केवल एक बार यदि संभव हो तो करो। हालांकि, अपनी परियोजना के भीतर जटिल निर्भरताओं का प्रबंधन करने के लिए, आपको सापेक्ष फाइलों की आवश्यकता हो सकती है। फिर require_relative 1.9 में जाने का तरीका है।

आखिरकार, एक परियोजना के लिए, मैं कुछ Dir["**/*.rb"] अभिव्यक्ति के साथ lib/में मुख्य फ़ाइल में सभी की आवश्यकता होगी। इसके बाद आपको शायद ही कभी require_relative की आवश्यकता होगी, क्योंकि केवल तभी आवश्यक है जब आप कक्षा के शरीर में एक और निरंतर संदर्भित करते हैं (विधियों की सभी सामग्री हल नहीं होती है, इसलिए इसमें कोई समस्या नहीं है)।

एक और समाधान इन स्थिरांक को आपकी मुख्य फ़ाइल में परिभाषित करना होगा, यह आपको संरचना का एक विचार भी देगा।

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