मुझे कक्षाओं का एक सेट विकसित करने के लिए एक परियोजना सौंपा गया है जो एक स्टोरेज सिस्टम के लिए एक इंटरफ़ेस के रूप में कार्य करता है।प्रवाह नियंत्रण के लिए अपवादों का उपयोग करने से मैं कैसे बच सकता हूं?
public CustomObject get(String key, Date ifModifiedSince)
मूल रूप से विधि CustomObject
key
के साथ जुड़े वापस जाने के लिए यदि और केवल यदि वस्तु ifModifiedSince
के बाद संशोधित किया गया है माना जाता है: एक आवश्यकता वर्ग का समर्थन है जो निम्न हस्ताक्षर के साथ एक प्राप्त विधि है। यदि स्टोरेज सिस्टम में key
नहीं है तो विधि को शून्य वापस करना चाहिए।
मैं परिदृश्य में जहाँ कुंजी मौजूद है, लेकिन वस्तु संशोधित नहीं किया गया कैसे निपटेंगे:
मेरे समस्या है?
यह महत्वपूर्ण है क्योंकि इस कक्षा का उपयोग करने वाले कुछ एप्लिकेशन वेब सेवाएं और वेब अनुप्रयोग होंगे। उन अनुप्रयोगों को यह जानने की आवश्यकता होगी कि 404 (नहीं मिला), 304 (संशोधित नहीं), या 200 (ठीक है, यहां डेटा है) वापस करना है या नहीं।
समाधान मैं वजन कर रहा हूँ कर रहे हैं:
- एक कस्टम अपवाद फेंक जब भंडारण प्रणाली शामिल नहीं है
key
- जब
ifModifiedSince
विफल रहता है एक कस्टम अपवाद फेंक। - कस्टमऑब्जेक्ट में एक स्टेटस प्रॉपर्टी जोड़ें। संपत्ति की जांच करने के लिए कॉलर की आवश्यकता है।
मैं इन तीन विकल्पों में से किसी से भी खुश नहीं हूं। मुझे विकल्प 1 और 2 पसंद नहीं है क्योंकि मुझे प्रवाह नियंत्रण के लिए अपवादों का उपयोग करना पसंद नहीं है। न तो मुझे एक मूल्य वापस करना पसंद है जब मेरा इरादा इंगित करना है कि कोई मूल्य था।
बहरहाल, मैं विकल्प की ओर झुकाव रहा हूँ 3.
वहाँ एक विकल्प मैं पर विचार नहीं कर रहा हूँ है? क्या इनमें से किसी भी तीन विकल्पों में से किसी के बारे में कोई मजबूत भावना है? इस सवाल का
जवाब सम्मान, व्याख्या:
- एक
contains
विधि प्रदान करें और,get(key, ifModifiedSince)
कॉल करने से पहले यह फोन अपवाद फेंक अगर कुंजी मौजूद नहीं है फोन करने वाले की आवश्यकता होती है, वापसी अशक्त यदि ऑब्जेक्ट संशोधित नहीं किया गया है। - एक समग्र वस्तु में प्रतिक्रिया और डेटा (यदि कोई हो) लपेटें।
- कुछ राज्य (
UNMODIFIED, KEY_DOES_NOT_EXIST
) को इंगित करने के लिए एक पूर्वनिर्धारित स्थिरांक का उपयोग करें। - कॉलर होने के लिए इंटरफ़ेस लागू करता है जो कॉलबैक के रूप में उपयोग किया जाता है।
- डिज़ाइन बेकार है।
मैं क्यों नहीं चुन सकते उत्तर # 1
मैं मानता हूँ कि यह आदर्श समाधान है, लेकिन यह एक है मैं पहले से ही (अनिच्छा से) को खारिज कर दिया था। इस दृष्टिकोण के साथ समस्या यह है कि इनमें से अधिकांश मामलों में इन वर्गों का उपयोग किया जाएगा, बैकएंड स्टोरेज सिस्टम एक तृतीय पक्ष रिमोट सिस्टम होगा, जैसे अमेज़ॅन एस 3। इसका मतलब है कि contains
विधि को स्टोरेज सिस्टम की एक राउंड ट्रिप की आवश्यकता होगी, जो ज्यादातर मामलों में एक और दौर यात्रा के बाद होगी। चूंकि यह दोनों समय और धन खर्च करेगा, यह एक विकल्प नहीं है।
यदि उस सीमा के लिए नहीं, तो यह सबसे अच्छा तरीका होगा।
(मुझे पता है मैं प्रश्न में इस महत्वपूर्ण तत्व का उल्लेख नहीं था, लेकिन मैं इसे संक्षिप्त रखने के लिए कोशिश कर रहा था जाहिर है यह प्रासंगिक था।।)
निष्कर्ष:
सभी उत्तरों को पढ़ने के बाद मैं इस निष्कर्ष पर पहुंचा हूं कि इस मामले में एक रैपर सबसे अच्छा तरीका है। अनिवार्य रूप से मैं एक प्रतिक्रिया कोड, और सामग्री निकाय (संदेश) सहित मेटा डेटा (शीर्षलेख) के साथ HTTP की नकल करूंगा। "==" .equals के बजाय() के साथ
static public final CustomObject UNCHANGED=new CustomObject();
एक मैच के लिए
और परीक्षण:
यह बुरा नहीं है, लेकिन इसे अधिक दृढ़ता से टाइप किया जाना चाहिए, और इसे सामान्य बनाने की आवश्यकता नहीं है। –
उस जोड़ी प्रकार को और अधिक दृढ़ता से टाइप नहीं किया जा सका, और आप चीजों को यथासंभव सामान्य क्यों नहीं बनाना चाहेंगे? पॉलिमॉर्फिज्म एक अच्छी बात है। – Apocalisp
एक पाए गए ऑब्जेक्ट और प्रतिक्रिया कोड दोनों को वापस करने के बजाय, आप किसी भी वस्तु या विफलता कोड को वापस कर सकते हैं। इसे किसी भी प्रकार के संघ प्रकार के साथ टाइप-सुरक्षित बनाया जा सकता है जैसे । – Apocalisp