2010-01-28 14 views
14

शून्य घोषित करने के विरोध में एक सफल संचालन को इंगित करने के लिए एक विधि हस्ताक्षर में लौटने वाले बूलियन के संबंध में कोई कठोर और तेज़ नियम हैं? मुझे लगता है कि मेरी कॉलिंग विधि में अधिक महत्वपूर्ण संचालन के लिए मैं जानना चाहता हूं कि कोई ऑपरेशन पूरा हुआ है, इसलिए मैं किसी भी मुद्दे को लॉग कर सकता हूं। क्या यह बूलियन का "अनुचित" उपयोग है?जावा में एक शून्य प्रकार घोषित करने के बजाय बूलियन लौट रहा है?

उत्तर

22

आमतौर पर मैं कुछ गलत होने पर संकेत देने के लिए Exception एस का उपयोग करता हूं।

false लौटने के बजाय, आप समस्या के बारे में एक विस्तृत संदेश के साथ throwException कर सकते हैं।

रिटर्निंग false आपको समस्या के बारे में अधिक जानकारी नहीं देता है।

फिर, false वापसी मान की जांच करने के बजाय, विधि कॉल को try/catch में डालें, यदि आप उम्मीद करते हैं कि विधि आसानी से विफल हो सकती है।

कई लोग शिकायत करेंगे कि यह विधि धीमी है। लेकिन, आपके द्वारा प्राप्त लाभ मंदी से काफी अधिक हैं। इसके अलावा, यदि आप जावा की गति का उपयोग कर रहे हैं तो आपकी # 1 चिंता नहीं होनी चाहिए।

+1

और अपवाद, असाधारण, असाधारण होना चाहिए। तो गति अंतर सामग्री होना चाहिए। –

+0

+1 के लिए "अपवाद, अच्छी तरह से, असाधारण होना चाहिए" –

1

यह एक ठीक प्रतिमान है, लेकिन यदि आप कॉलर को मामले को संभालने के लिए मजबूर करना चाहते हैं तो ऑपरेशन सफलतापूर्वक पूरा नहीं होता है, तो आप इसके बजाय एक चेक अपवाद फेंकना चाहेंगे।

यह पैटर्न मूल जावा पुस्तकालयों में होता है, हालांकि। उदाहरण के रूप में File.delete() देखें।

+0

-1: यह "ठीक" प्रतिमान नहीं है; यह एक त्रुटि के बाद "ब्लंडरिंग" के कारण आपदा के लिए एक भयानक नुस्खा है। –

+1

मुझे लगता है कि आपके पास बहुत आगे वोटिंग है। रोटोरिक के लिए – danben

+1

+1 हालांकि। – danben

1

सफलता लौटने के लिए आम तौर पर क्या आप देख है:

  • वापसी एक बूलियन
  • वापसी शून्य है, लेकिन त्रुटि
  • वापसी वाला स्थिति कोड (कम जावा में आम) पर फेंक अपवाद।

सफलता के लिए बुलियन लौटने के साथ कुछ भी गलत नहीं देख सकता, जब तक आपको अपवाद व्यवहार की जानकारी की आवश्यकता न हो।

+0

सफलता के लिए लौटने वाले बूलियन के साथ (संभावित) समस्या आसानी से है जिसके साथ कोई भी विफलता के लिए बूलियन को अनदेखा कर सकता है। यहां तक ​​कि रनटाइम अपवाद भी बहुत अधिक है और कोडिंग और परीक्षण दोनों के दौरान अनदेखा होने की संभावना कम है। – ILMTitan

6

मुझे आम तौर पर लगता है कि विफलता के मामले में अपवाद फेंकना एक बूलियन लौटने की तुलना में एक बेहतर समाधान है, क्योंकि आम तौर पर इस पर ध्यान नहीं दिया जाता है कि प्रक्रिया सफल हुई है - मुझे केवल यह ख्याल है कि यह असफल रहा है या नहीं। अपवाद का उपयोग करके मैं इस प्रक्रिया के बारे में कोई भी जानकारी प्रदान कर सकता हूं कि प्रक्रिया वास्तव में क्यों विफल रही।

यदि अपवाद अपमानजनक प्रतीत होते हैं, तो आप एक कस्टम स्थिति ऑब्जेक्ट वापस कर सकते हैं जिसमें एक बुलियन और एक स्टेटस संदेश ("6 नए फूबार्स जोड़ा गया" या "फ़ोबोब जोड़ना नहीं था क्योंकि फूबिन भरा हुआ है!"), हालांकि यह निश्चित रूप से अधिक जटिल है।

0

यह ठीक लगता है, लेकिन शैतान विवरण में निहित है। ;-)

अपवाद फेंकना पेशेवर और विपक्ष के साथ मुख्य विकल्प है।

मुझे लगता है कि आप सटीक कोडिंग के नमूने उपलब्ध कराने के द्वारा और अधिक जानकारी प्राप्त कर सकते हैं ...

4

केवल स्थितियों में ऐसा करते हैं, जहां यह स्पष्ट है कि कुछ एक बूलियन परिणाम है। IsValidCustomer() या ऐसे कुछ की तरह।

अन्य सभी चीजों को जहां आपको लगता है आप इसे दे सकते हैं के लिए, यह शायद मतलब है कि आप, Exception किसी तरह के साथ काम कर रहे हैं, और तुम सच में रैप करने के लिए है कि एक साधारण बूलियन true/false साथ नहीं करना चाहती क्योंकि आप कर सकते हैं विभिन्न प्रकार के स्वाद (विभिन्न अपवाद) हैं और कुछ कारण गलत क्यों हैं, जिन्हें आप जानना चाहते हैं।

तो या तो अपवाद को ढेर को बुलबुला दें, या इसे पकड़ें और इसे कस्टम अपवाद में बदल दें या इसे लॉग करें या जो भी हो।

1

यदि कोई अप्रत्याशित परिणाम है, तो अपवाद फेंक दें। यदि आप सिर्फ यह कार्य करना चाहते हैं कि "क्या मैंने एक्स किया" तो एक बूलियन लौटाएं।

1

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

दूसरी तरफ, यदि "त्रुटि" का अर्थ है कि मेरा प्रोग्राम एक अलग प्रवाह पथ लेता है, तो एक बूलियन लौटने से अधिक समझ आता है। जैसे, अगर मैं एक विशिष्ट ग्राहक की तलाश में हूं और यदि वह मौजूद है तो मैं उसका रिकॉर्ड अपडेट करता हूं और यदि वह एक नया ग्राहक रिकॉर्ड नहीं बनाता है, तो यह बुलियन लौटने के लिए बहुत समझ में आता है, और कॉलर परीक्षण में और जब सत्य एक पथ का पालन करें और जब दूसरा झूठा हो।

वास्तव में यह शब्द "त्रुटि" के दो बहुत अलग अर्थ हैं, और वे अलग-अलग हैंडलिंग के लिए कॉल करते हैं। यह काफी संभव है कि वही कार्य दोनों ही कर सकता है। जैसे, वापस लौटने पर, झूठी वापसी नहीं मिली, आई/ओ त्रुटि पर एक अपवाद फेंकने की कोशिश कर रहा है।

2

गैर-असाधारण विफलता परिणामों को इंगित करने के लिए बूलियन मानों का उपयोग करें। एक उदाहरण एक खोज समारोह होगा। नाममात्र विफलता नहीं मिलेगी। संचार करना कि अपवादों के साथ परिणाम अनावश्यक है। असाधारण मामलों के लिए अपवाद बचाओ; के बीच का अंतर और नहीं खोज सकता है।

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