पहले कुछ पृष्ठभूमि:मैं अपवादों का उपयोग किए बिना किसी विधि से विफलता विवरण कैसे लौटा सकता हूं और वैकल्पिक रूप से मूल्य शामिल कर सकता हूं?
मेरे पास पहले से ही एक परिणाम वर्ग है जिसे मैंने परिणाम जानकारी ले जाने के लिए लागू किया है। उन्हें विशेष रूप से असफलताओं के लिए लागू किया गया था, एक सफल परिणाम में आमतौर पर कोई अतिरिक्त जानकारी नहीं होती है। मैं उन्हें अपनी परियोजनाओं में से किसी एक में कोर एपीआई के बाहर सार्वजनिक तरीकों से या विधियों में एक या दो परतों में गहराई से उपयोग करता हूं जहां मुझे सार्वजनिक एपीआई में विस्तृत जानकारी लेनी पड़ती है। इस एपीआई में कंटेनर और कमांड लाइन क्लाइंट का उपभोग किया जाता है और पहले बहुत ही अपवाद को खुश किया गया था। विकल्प इस विफलता संदर्भ जानकारी को अपवादों में जोड़ रहा था, और कई और अलग अपवाद वर्गों को जोड़ रहा था, जहां वे अभी नहीं थे।
- ResultStatus:
http://blogs.atlassian.com/2011/05/exceptions_are_bad
परिणाम एक सहायक enum और इंटरफ़ेस है: सफलता, असफलता, CONDITIONAL_SUCCESS आदि धारण पूर्णांक वापसी कोड और वर्गीय संदेश (जैसे "मैं यह मेरी सामान्य दृष्टिकोण को दर्शाता है लगता है ऑपरेशन सफल रहा ")
- परिणाम कोड: टैगिंग एनम परिणाम कोड, FILE_NOT_FOUND, FILE_INVALID, FILE_INCOMPATIBLE टैग करने के लिए खाली इंटरफ़ेस। ये इकाई और कार्यात्मक परीक्षण के लिए ज्यादातर रहे हैं, लेकिन यह भी ऑनलाइन मदद के लिए उपयोग किया जाता है
परिणाम के लिए की स्थिति के लिए स्थिर कारखाने विधियों, और बिल्डर तरीके प्रदान (विफलता पर Maven की मदद कार्यात्मक मैं क्या कर रहा हूँ के समान है) अन्य प्रमुख क्षेत्रों को सेट करें और अपरिवर्तनीय है। यहाँ एक परिणाम के निर्माण के लग रहा है जैसे:
Result.success().withCode(ResultCode).withMessage("");
और लौट आए परिणाम का मूल्यांकन:
result.isSuccessful();
result.hasCode(ResultCode);
result.getMessage();
मेरे समस्या:
दृष्टिकोण बहुत सफल रहा है, विशेष रूप से कार्यात्मक परीक्षण एक हवा बनाने हालांकि, मेरे पास एक बड़ा अंतर है: जबकि अधिकांश मामलों में मुझे केवल परिणाम की परवाह है, कुछ महत्वपूर्ण क्षेत्रों में मुझे परिणाम के साथ मूल्य वापस करने की आवश्यकता है।
मैं अपने पहले प्रयास से खुश नहीं हूं: ResultPair<T>
जिसमें परिणाम और मूल्य है जहां टी मान का प्रकार है। जब तक मैं सभी परिणाम विधियों को डुप्लिकेट नहीं करता हूं, कक्षा का उपयोग करके वर्बोज़ और बेकार है: परिणाम प्राप्त करें, इसे परिणामस्वरूप जोड़ें, और परिणामों का मूल्यांकन करने से पहले परिणाम निकाल दें और मूल्य दें। पहली नज़र में, विरासत बिल्डर पैटर्न की वजह से काम नहीं करेगी और मैं स्पष्ट, साफ कोड प्राप्त करने के तरीके के बारे में बिल्कुल नहीं सोच सकता कि परिणाम पूरी तरह से परिणाम वर्ग को डुप्लिकेट किए बिना अनुमति देता है।
आदर्श रूप से, दृष्टिकोण वैकल्पिक रूप से मूल्य को वापस करने की अनुमति देगा, लेकिन मैं इसे एक प्रकार के सुरक्षित तरीके से करने का तरीका नहीं सोच सकता जो सुनिश्चित करता है कि विधि हस्ताक्षर स्पष्ट रूप से मूल्य के प्रकार को इंगित करते हैं, लेकिन इससे बचने से बचा जाता है अर्थहीन जेनेरिक पैरामीटर हर जगह मैं एक मूल्य वापस नहीं करता हूं।
मैं वास्तव में दो वर्गों होने से परहेज नहीं करते और यह परिणाम बिल्डर और मूल्यांकन कोड नकल करने, यह सिर्फ लगता है गलत दुनिया के अंत नहीं है और मैं अनुभव की कमी मुझे के बेहतर हो रही है की तरह महसूस और मैं एक (स्पष्ट या स्पष्ट नहीं) समाधान खो रहा हूँ। मैं अमरूद का उपयोग कर रहा हूं और मैं एक दोस्ताना तरीके से शून्य मानों को अस्वीकार करना चाहता हूं, इसलिए वैकल्पिक रूप से सभी मानों को वैकल्पिक रूप से लपेटना चाहूंगा, लेकिन मुझे अभी भी सामान्य पैरामीटर की आवश्यकता होगी (और परिणाम.value से बचने के लिए इसे कक्षा में लिखें () .get() ... ठीक है, मैं अब जोर से सोच रहा हूं। मुझे एक सवाल पूछना चाहिए ...)।
क्या इन स्पष्ट रूप से परस्पर अनन्य आवश्यकताओं को पूरा करने का कोई तरीका है?
+1 एक सहकर्मी ने हमारे कोड के लिए कुछ बहुत ही समान किया और यह बहुत मदद करता है। – user949300