2010-09-17 9 views
9

मैं केवल "बचाव" अपवादों के लिए नहीं, सब कुछ के लिए rescue का उपयोग करता हूं। मेरा मतलब है, मैं बस जिस तरह से मुझे सत्यापन और डबल चेकिंग डेटा बचाता है उससे प्यार करता हूँ।क्या मैं शून्य जांच के लिए "बचाव" का दुरुपयोग कर रहा हूं?

उदाहरण के लिए, मान लें कि मेरे पास एक मॉडल Item है जो User हो सकता है या नहीं। तब, जब मैं आइटम के मालिक का नाम प्राप्त करना चाहते हैं मैं लिखने:

item.user.name rescue "" 
बजाय

की तरह कुछ
item.user.nil? ? "" : item.user.name 

यह वही थिंक बनाता है, क्योंकि nil.name ट्रिगर एक अपवाद है कि मैं "" साथ बचाव , लेकिन मुझे पूरा यकीन नहीं है कि यह अच्छा अभ्यास है। यह वही बनाता है जो मैं चाहता हूं, और यह कम कोड के साथ बनाता है, लेकिन ... मुझे नहीं पता, rescue शब्द और यहां मुझे असुरक्षित महसूस होता है।

क्या यह एक बुरा अभ्यास है या क्या यह rescue कीवर्ड का दुरुपयोग करने योग्य है?

+1

Avdi Grimm का तर्क है कि 'try' एक कोड गंध है http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-no-try/ और http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/, तो यह सिर्फ इतना नहीं है कि आप यह कैसे कर रहे हैं यह बुरा है, लेकिन वह आप जो करने की कोशिश कर रहे हैं वह खराब है। –

+1

@AndrewGrimm कोई संबंध है? – ybakos

+1

@ybakos मुझे नहीं पता, लेकिन हम [भाइयों] नहीं हैं (http://en.wikipedia.org/wiki/brothers_Grimm)। –

उत्तर

7

मुझे लगता है कि आप थोड़ा बचाव का दुरुपयोग कर रहे हैं, हालांकि रेल में, इन मुद्दों के लिए एक विशिष्ट विधि है: tryDocumentation

आपके मामले में, item.user.try(:name) एक अच्छा दृष्टिकोण हो सकता है।

+1

असल में, क्योंकि उन्होंने कहा कि 'आइटम' में 'उपयोगकर्ता' हो सकता है या नहीं, मुझे विश्वास है कि उन्हें 'item.try (: user) .try (: name) ':] –

+1

मुझे विश्वास नहीं है । अगर उसके पास कोई वस्तु नहीं है, तो हाँ, आप सही हैं। लेकिन, यदि आइटम में उपयोगकर्ता हो या नहीं हो, तो वह उन स्थितियों को पकड़ने के लिए 'try' का उपयोग करने का पूरा बिंदु है, जहां 'item.user'' उपयोगकर्ता' के बजाय शून्य वापस आती है। – theIV

1

अधिकांश अन्य भाषाओं की तरह, चेक स्वयं को बचाव का उपयोग करने से तेज़ी से चलाएगा।

3

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

1

अपने rescue दुरुपयोग के विकल्प के रूप में, andand मणि देखें। यह try जैसा ही सुझाया गया है, लेकिन एक अच्छा पोस्ट किया गया है। andand आप कहते हैं की सुविधा देता है:

item.user.andand.name 

अभिव्यक्ति हो जाएगा nil अगर item.usernil है।

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