हाल ही में, मैं एक और प्रोग्रामर के साथ "अगर" बयान से भरे विशाल (1000 लाइनों) विधि को दोबारा करने का सबसे अच्छा तरीका चर्चा कर रहा था।कक्षाओं की श्रृंखला-जिम्मेदारी बनाम सूचियों के फायदे क्या हैं?
कोड जावा में लिखा गया है, लेकिन मुझे लगता है कि यह समस्या सी # जैसी अन्य भाषाओं में भी हो सकती है।
इस समस्या को हल करने के लिए, उन्होंने एक श्रृंखला-जिम्मेदारी पैटर्न का उपयोग करने का सुझाव दिया। उन्होंने आधार "हैंडलर" कक्षा का प्रस्ताव देने का प्रस्ताव रखा। फिर, "हैंडलर 1", "हैंडलर 2" इत्यादि "हैंडलर" का विस्तार करेंगे।
फिर, हैंडलरों के पास "getSuccessor" विधि होगी, जो या तो शून्य (यदि यह श्रृंखला का अंतिम भाग था) या श्रृंखला के अगले हैंडलर को वापस कर देगा।
फिर, "हैंडलआरक्वेट (अनुरोध)" फ़ंक्शन या तो अनुरोध के साथ सौदा करेगा, या इसे श्रृंखला के आगे भेज देगा और यदि पिछले समाधानों में से कोई भी काम नहीं करता है, तो यह केवल शून्य या वापस अपवाद फेंक देगा।
श्रृंखला में एक नया हैंडलर जोड़ने के लिए, कोडर श्रृंखला के अंतिम तत्व पर जायेगा और बताएगा कि एक नया तत्व था। कुछ करने के लिए, वह सिर्फ श्रृंखला के पहले तत्व पर हैंडलरक्वेट को कॉल करेगा।
इस समस्या को हल करने के लिए, मैंने एक अलग दृष्टिकोण का उपयोग करने का सुझाव दिया।
मेरे पास "हैंडलर" कक्षा भी है, जिसमें "हैंडलर 1", "हैंडलर 2", जैसा कि पिछली विधि का उल्लेख किया गया है।
हालांकि, कोई "getSuccessor" विधि नहीं होगी। इसके बजाय, मेरे पास हैंडलर की एक सूची (एक वेक्टर, एक ऐरेलिस्ट, या जो भी इस मामले में सबसे अच्छा है) के साथ एक संग्रह कक्षा होगी।
हैंडलरक्वैस्ट फ़ंक्शन अभी भी मौजूद होगा, लेकिन यह अगले हैंडलरों को कॉल का प्रचार नहीं करेगा। यह सिर्फ अनुरोध को संसाधित करेगा या शून्य वापस करेगा।
एक अनुरोध को पूरा करने के लिए, एक
for(Handler handle : handlers){
result = handle.handleRequest(request);
if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach
का प्रयोग करेंगे या, कोड दोहराव को रोकने के लिए, एक "parseRequest (अनुरोध)" विधि संग्रह वर्ग के लिए जोड़ा जा सकता है। नया हैंडलर जोड़ने के लिए, कोई संग्रह कन्स्ट्रक्टर (या स्थैतिक {} ब्लॉक, या कुछ समकक्ष) पर जायेगा और बस "एडहैंडलर (नया हैंडलर 3()) कोड जोड़ें;"।
इस दृष्टिकोण के साथ मैं वास्तव में क्या जिम्मेदारी का सामना कर रहा हूं? कौन सी विधि सर्वोत्तम है (मान लीजिए एक सर्वोत्तम विधि है)? क्यूं कर? प्रत्येक डिज़ाइन विधि के कारण संभावित बग और समस्याएं क्या हो सकती हैं?
if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.
बहुत गहरी रिकर्सन कोई समस्या नहीं होनी चाहिए। यह अपेक्षाकृत छोटा है (सिस्टम ओवरफ्लो ढेर करने के लिए आवश्यक हजारों विधि कॉल के पास कहीं भी नहीं)। – luiscubal