true
यदि आप false
असफलता पर नहीं लौटते हैं तो सफलता पर लौटने का कोई कारण नहीं है । क्लाइंट कोड कैसा दिखना चाहिए?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
इस मामले में, कॉल करने वाले को किसी भी तरह से ब्लॉक-कैच करने की आवश्यकता होती है, लेकिन फिर वह बेहतर लिख सकता है:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
इसलिए true
कॉलर के लिए रिटर्न वैल्यू पूरी तरह से irelevant है। तो बस विधि रखिए void
।
सामान्य तौर पर, फेलियर मोड डिजाइन करने के तीन तरीके हैं।
- सच्चा / झूठा लौटें
- उपयोग
void
, फेंक (जाँच) अपवाद
- एक मध्यवर्ती परिणाम वस्तु लौटाएं ।
वापसी true
/false
यह कुछ पुराने, ज्यादातर सी-स्टाइल एपीआई में उपयोग किया जाता है। Downsides obviuos हैं, आपको पता नहीं है कि क्या गलत हुआ। PHP यह अक्सर करता है, इस तरह कोड के लिए अग्रणी:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
बहु-थ्रेडेड संदर्भों में, यह और भी खराब है।
अपवादों को फेंका (चेक किया गया)
यह एक अच्छा तरीका है। कुछ बिंदुओं पर, आप विफलता की उम्मीद कर सकते हैं। जावा यह सॉकेट्स के साथ करता है। मूल धारणा यह है कि एक कॉल सफल होना चाहिए, लेकिन हर कोई जानता है कि कुछ संचालन विफल हो सकते हैं। सॉकेट कनेक्शन उनमें से हैं। तो कॉल करने वाला विफलता को संभालने के लिए मजबूर हो जाता है। इसका अच्छा डिज़ाइन, क्योंकि यह सुनिश्चित करता है कि कॉलर वास्तव में विफलता को संभालता है, और विफलता से निपटने के लिए कॉलर को एक सुंदर तरीका देता है।
परिणाम वस्तु वापस करें
इसे संभालने का यह एक और अच्छा तरीका है। इसका उपयोग अक्सर पार्सिंग या केवल उन चीजों के लिए किया जाता है जिन्हें मान्य करने की आवश्यकता होती है।
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
कॉल करने वाले के लिए भी अच्छा, स्वच्छ तर्क।
दूसरे मामले का उपयोग करने के लिए, और तीसरे का उपयोग करने के लिए कब बहस होती है। कुछ लोगों का मानना है कि अपवाद असाधारण होना चाहिए और यह कि आपको अपवादों की संभावना को ध्यान में नहीं रखना चाहिए, और हमेशा तीसरे विकल्पों का उपयोग करना चाहिए। यह ठीक है। लेकिन हमने जावा में अपवादों की जाँच की है, इसलिए मुझे उनके उपयोग न करने का कोई कारण नहीं दिखता । मैं चेक एक्सपेक्टेशन्स का उपयोग करता हूं जब मूल धारणा यह है कि कॉल को सुसीट करना चाहिए (जैसे सॉकेट का उपयोग करना), लेकिन विफलता संभव है, और मैं तीसरे विकल्प का उपयोग करता हूं जब इसकी बहुत अस्पष्ट मलबे कॉल को सुसाइड करना चाहिए (जैसे डेटा को मान्य करना)। लेकिन इस पर अलग-अलग राय है।
आपके मामले में, मैं void
+ के साथ जाऊँगा Exception
। आप अपेक्षा करते हैं कि फ़ाइल अपलोड आगे बढ़े, और जब यह असाधारण हो। लेकिन कॉल करने वाले को उस विफलता मोड को संभालने के लिए मजबूर किया जाता है, और आप एक अपवाद वापस कर सकते हैं जो ठीक से वर्णन करता है कि किस तरह की त्रुटि हुई।