2010-08-05 11 views
5

मुझे आश्चर्य है कि किसी को यह सत्यापित करना चाहिए कि किसी विधि को पारित तर्क एक निश्चित वर्ग का है।रुबी में तर्कों की पुष्टि करें?

उदाहरण के लिए।

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

यह यह करने के लिए स्मार्ट है या यह सिर्फ बोझिल और सभी तर्क में पारित मान्य करने के लिए समय की बर्बादी है?

क्या ऐसी परिस्थितियां हैं जब आप इस अतिरिक्त सुरक्षा और परिस्थितियों को रखना चाहते हैं जब आप परेशान नहीं होंगे?

अपने अनुभव साझा करें!

उत्तर

9

मैं इस विशिष्ट दृष्टिकोण की अनुशंसा नहीं करता, क्योंकि आप हैश या सरणी अर्थशास्त्र प्रदान करने वाले वर्गों को समायोजित करने में विफल रहते हैं लेकिन वह वर्ग नहीं हैं। अगर आपको इस तरह के सत्यापन की आवश्यकता है, तो आप विधि नाम के साथ respond_to? का उपयोग बंद कर सकते हैं। Arrays विधि को लागू करें: [], इसके लायक क्या है।

ओपनस्ट्रक्चर में हैश सेमेन्टिक्स और विशेषता-एक्सेसर विधि अर्थशास्त्र है, लेकिन hash.class==Hash की स्थिति के लिए सच नहीं होगा। यह अभ्यास में हैश की तरह काम करेगा, यद्यपि।

इसे परिप्रेक्ष्य में रखने के लिए, यहां तक ​​कि एक गैर गतिशील भाषा में भी आप इसे इस तरह से नहीं करना चाहते हैं; आप यह सत्यापित करना चाहते हैं कि कोई ऑब्जेक्ट IDictionary<T> लागू करता है। रुबी बेवकूफ रूप से पसंद करेंगे, जब आवश्यक हो, आप सत्यापित करते हैं कि विधि मौजूद है, क्योंकि यदि ऐसा होता है, तो डेवलपर शायद अपनी वस्तु को समान रूप से कार्य करने का इरादा रखता है। आप गैर-गतिशील होने के लिए मजबूर करने के विकल्प के रूप में क्लाइंट कोड के चारों ओर यूनिट परीक्षणों के साथ अतिरिक्त सैनिटी प्रदान कर सकते हैं।

4

मुझे लगता है कि यह अनावश्यक है। मैंने एक बार ब्लॉग पर कुछ पढ़ा जैसे "अगर आपको बेवकूफ लोगों से अपने कोड की रक्षा करने की ज़रूरत है, तो रूबी आपके लिए भाषा नहीं है।"

+1

यह सच है। अपने प्रोग्रामर को क्यों मान्य करें =) –

1

यदि आप कंपाइलर/रनटाइम-लागू कोड अनुबंध चाहते हैं, तो रूबी आपके लिए नहीं है। यदि आप एक लचीली भाषा और आसान टेस्टेबिलिटी चाहते हैं, तो रूबी है।

5

आमतौर पर उस तर्क को मान्य करने की आवश्यकता नहीं होती है जो एक निश्चित वर्ग के होते हैं। रुबी में, आपको Duck Typing का उपयोग करने के लिए प्रोत्साहित किया जाता है।

1

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

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