मैं एक ऐसी परियोजना पर काम कर रहा हूं जो अनुरोधों को संसाधित करती है, और अनुरोध के दो घटक हैं: कमांड और पैरामीटर। प्रत्येक कमांड के लिए हैंडलर बहुत सरल है (<10 लाइनें, अक्सर <5)। कम से कम 20 कमांड हैं, और संभावना 50 से अधिक होगी।
मैं समाधान के एक जोड़े के साथ आया हूँ:
- एक बड़ा स्विच / यदि -अन्य आदेशों पर
- कार्यों के लिए कमांड का नक्शा
- स्टेटिक क्लास / सिंगलेट्स के लिए कमांड का नक्शा
प्रत्येक कमांड थोड़ी सी त्रुटि की जाँच करता है, और केवल एक बिट जिसे अमूर्त किया जा सकता है, मापदंडों की संख्या के लिए जाँच कर रहा है, जो प्रत्येक कमांड के लिए परिभाषित है।
इस समस्या का सबसे अच्छा समाधान क्या होगा, और क्यों? मैं किसी भी डिजाइन पैटर्न के लिए खुला हूं जो मुझे याद हो सकता है।
मैं प्रत्येक के लिए निम्नलिखित समर्थक / चोर सूची के साथ आया हूँ:
स्विच
- पेशेवरों
- सभी फ़ंक्शन को एक फ़ंक्शन में रखता है; चूंकि वे सरल हैं, इसलिए यह एक दृश्य खोज तालिका बनाता है
- छोटे कार्यों / वर्गों के टन के साथ स्रोत को अव्यवस्थित करने की आवश्यकता नहीं है जो केवल एक ही स्थान पर उपयोग किए जाएंगे
- विपक्ष
- बहुत लम्बा
- प्रोग्रामेटिक रूप से कमांड्स जोड़ना मुश्किल है (डिफ़ॉल्ट केस का उपयोग करके चेन की आवश्यकता है)
नक्शा कमांड -> फ़ंक्शन
- पेशेवरों
- छोटे, काटने का आकार
- प्रोग्रामेटिक रूप से कमांड जोड़ / हटा सकते हैं
- विपक्ष
- यदि इन-लाइन किया जाता है, तो समान रूप से स्विच के रूप में
- यदि इन-लाइन नहीं किया जाता है, तो बहुत सारे फ़ंक्शन केवल एक ही स्थान पर उपयोग किए जाते हैं
मैप कमांड्स -> स्टेटिक क्लास / सिंगलटन
- पेशेवरों
- साधारण त्रुटि जाँच को संभालने के लिए बहुरूपता का उपयोग कर सकते हैं (केवल 3 पंक्तियों की तरह, लेकिन फिर भी)
- मानचित्र के समान लाभ -> फ़ंक्शन समाधान
- विपक्ष
- बहुत छोटे वर्गों के बहुत से परियोजना अव्यवस्था होगी
- कार्यान्वयन सभी एक ही स्थान पर नहीं है, इसलिए कार्यान्वयन को स्कैन करना उतना आसान नहीं है
अतिरिक्त नोट:
मैं इसे गो में लिख रहा हूं, लेकिन मुझे नहीं लगता कि समाधान भाषा-विशिष्ट है। मैं एक अधिक सामान्य समाधान की तलाश कर रहा हूं क्योंकि मुझे अन्य भाषाओं में कुछ ऐसा ही करने की आवश्यकता हो सकती है।
एक कमांड एक स्ट्रिंग है, लेकिन मैं आसानी से इसे एक नंबर पर मैप कर सकता हूं यदि सुविधाजनक हो। फ़ंक्शन हस्ताक्षर कुछ इस तरह है:
Reply Command(List<String> params)
गो में शीर्ष-स्तरीय फ़ंक्शंस हैं, और जिन अन्य प्लेटफ़ॉर्म पर मैं विचार कर रहा हूं उनमें शीर्ष-स्तरीय फ़ंक्शंस भी हैं, इसलिए दूसरे और तीसरे विकल्प के बीच अंतर है।