2012-01-13 7 views
6

पहले कुछ पृष्ठभूमि:मैं अपवादों का उपयोग किए बिना किसी विधि से विफलता विवरण कैसे लौटा सकता हूं और वैकल्पिक रूप से मूल्य शामिल कर सकता हूं?

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

  1. ResultStatus:

    http://blogs.atlassian.com/2011/05/exceptions_are_bad

    परिणाम एक सहायक enum और इंटरफ़ेस है: सफलता, असफलता, CONDITIONAL_SUCCESS आदि धारण पूर्णांक वापसी कोड और वर्गीय संदेश (जैसे "मैं यह मेरी सामान्य दृष्टिकोण को दर्शाता है लगता है ऑपरेशन सफल रहा ")

  2. परिणाम कोड: टैगिंग एनम परिणाम कोड, FILE_NOT_FOUND, FILE_INVALID, FILE_INCOMPATIBLE टैग करने के लिए खाली इंटरफ़ेस। ये इकाई और कार्यात्मक परीक्षण के लिए ज्यादातर रहे हैं, लेकिन यह भी ऑनलाइन मदद के लिए उपयोग किया जाता है

परिणाम के लिए की स्थिति के लिए स्थिर कारखाने विधियों, और बिल्डर तरीके प्रदान (विफलता पर Maven की मदद कार्यात्मक मैं क्या कर रहा हूँ के समान है) अन्य प्रमुख क्षेत्रों को सेट करें और अपरिवर्तनीय है। यहाँ एक परिणाम के निर्माण के लग रहा है जैसे:

Result.success().withCode(ResultCode).withMessage(""); 

और लौट आए परिणाम का मूल्यांकन:

result.isSuccessful(); 
result.hasCode(ResultCode); 
result.getMessage(); 

मेरे समस्या:

दृष्टिकोण बहुत सफल रहा है, विशेष रूप से कार्यात्मक परीक्षण एक हवा बनाने हालांकि, मेरे पास एक बड़ा अंतर है: जबकि अधिकांश मामलों में मुझे केवल परिणाम की परवाह है, कुछ महत्वपूर्ण क्षेत्रों में मुझे परिणाम के साथ मूल्य वापस करने की आवश्यकता है।

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

आदर्श रूप से, दृष्टिकोण वैकल्पिक रूप से मूल्य को वापस करने की अनुमति देगा, लेकिन मैं इसे एक प्रकार के सुरक्षित तरीके से करने का तरीका नहीं सोच सकता जो सुनिश्चित करता है कि विधि हस्ताक्षर स्पष्ट रूप से मूल्य के प्रकार को इंगित करते हैं, लेकिन इससे बचने से बचा जाता है अर्थहीन जेनेरिक पैरामीटर हर जगह मैं एक मूल्य वापस नहीं करता हूं।

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

क्या इन स्पष्ट रूप से परस्पर अनन्य आवश्यकताओं को पूरा करने का कोई तरीका है?

+0

+1 एक सहकर्मी ने हमारे कोड के लिए कुछ बहुत ही समान किया और यह बहुत मदद करता है। – user949300

उत्तर

2

आप बना सकते हैं अपने ResultPair<T> रूप शून्य परिणाम वर्ग के लिए एक आधार वर्ग:

public class Result extends ResultPair<Void> { ... } 

सभी प्रासंगिक तरीकों ResultPair<T> में घोषित की जाएगी।

अद्यतन:

अभी तक बेहतर, केवल एक ही प्रकार Result<T> है, और Result<Void> का उपयोग जब भी आप एक वापसी मान के लिए नहीं करना चाहती। या, यदि Void का उपयोग किसी प्रकार के तर्क के रूप में करना आपके लिए अजीब लगता है, तो एक नया अनइंस्टेंटिएबल (या सिंगलटन) प्रकार बनाएं जिसका अर्थ है "कोई परिणाम नहीं है", और इसके बजाय इसका उपयोग करें: Result<Unit>, उदाहरण के लिए।

+0

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

+0

दुर्भाग्यवश, यह ऐसा नहीं करता है। ResultPair वापस आने वाले स्थिर या बिल्डर विधियों का उपयोग करने के प्रयास परिणाम के साथ प्रकार के विसंगतियों का कारण बनेंगे - मुझे स्थिर विधियों को डुप्लिकेट करना होगा, और स्पष्ट रूप से निर्माता विधियों के परिणामस्वरूप डालना होगा। –

+0

हां, यह बहुत बुरा है ... मुझे लगता है कि आपको उन विधियों को डुप्लिकेट करना होगा, लेकिन उन्हें एक सामान्य कार्यान्वयन के लिए जितना संभव हो उतना _ _ को प्रतिनिधि करने का प्रयास करें, दूसरे शब्दों में, कोड डुप्लिकेशन को कम करने के लिए उन्हें दोबारा दोहराएं। –

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

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