मेरे पास ग्राहक भुगतानों को संसाधित करने के लिए उपयोग किया जाने वाला एक वर्ग है। इस वर्ग के सभी तरीकों में से एक, प्रत्येक ग्राहक के लिए एक ही है, एक को छोड़कर, जो इस बात की गणना करता है (उदाहरण के लिए) कि ग्राहक कितना बकाया है। यह ग्राहक से ग्राहक के लिए बहुत भिन्न हो सकता है और गुण फ़ाइल जैसी किसी चीज़ में गणनाओं के तर्क को पकड़ने का कोई आसान तरीका नहीं है, क्योंकि कस्टम कारकों की कोई भी संख्या हो सकती है।
मैं बदसूरत कोड लिख सकता हूं जो customerID के आधार पर स्विच करता है:
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
लेकिन इसके लिए हमें हर बार एक नया ग्राहक प्राप्त करने के लिए कक्षा के पुनर्निर्माण की आवश्यकता होती है। बेहतर तरीका क्या है?
[संपादित करें] "डुप्लिकेट" लेख पूरी तरह से अलग है। मैं यह नहीं पूछ रहा हूं कि स्विच स्टेटमेंट से कैसे बचा जाए , मैं इस मामले पर लागू होने वाले आधुनिक डिजाइन के लिए पूछ रहा हूं - जिसे मैं एक स्विच स्टेटमेंट के साथ हल कर सकता हूं अगर मैं डायनासोर कोड लिखना चाहता था। दिए गए उदाहरण सामान्य हैं, और सहायक नहीं हैं, क्योंकि वे अनिवार्य रूप से कहते हैं "अरे, स्विच कुछ मामलों में बहुत अच्छा काम करता है, कुछ अन्य में नहीं।"
[संपादित करें] मैंने निम्नलिखित कारणों के लिए शीर्ष क्रम के उत्तर के साथ जाने का फैसला किया है (प्रत्येक ग्राहक के लिए एक अलग "ग्राहक" वर्ग बनाएं जो एक मानक इंटरफ़ेस लागू करता है):
संगति: मैं एक इंटरफ़ेस बना सकता हूं जो सभी ग्राहक वर्गों को प्राप्त करता है और एक ही आउटपुट प्राप्त करता है, भले ही किसी अन्य डेवलपर द्वारा बनाया गया हो
रख-रखाव: सभी कोड एक ही भाषा (जावा) में लिखे गए हैं, इसलिए किसी अन्य को अलग कोडिंग भाषा सीखने की आवश्यकता नहीं है ताकि यह सुनिश्चित हो सके कि एक मृत-सरल सुविधा क्या होनी चाहिए।
पुन: उपयोग: कोड में एक समान समस्या फसलों के मामले में, मैं "कस्टम" तर्क को लागू करने के लिए किसी भी संख्या को रखने के लिए ग्राहक वर्ग का पुन: उपयोग कर सकता हूं।
परिचित: मैं पहले से ही जानता हूं कि यह कैसे करना है, इसलिए मैं इसे जल्दी से प्राप्त कर सकता हूं और अन्य, अधिक दबाव वाले मुद्दों पर आगे बढ़ सकता हूं।
कमियां:
प्रत्येक नए ग्राहक को नए ग्राहक वर्ग के संकलन की आवश्यकता होती है, जो परिवर्तनों को संकलित और तैनात करने के तरीके में कुछ जटिलता जोड़ सकता है।
प्रत्येक नए ग्राहक को एक डेवलपर द्वारा जोड़ा जाना है - एक समर्थन व्यक्ति केवल गुण फ़ाइल जैसी किसी चीज़ में तर्क नहीं जोड़ सकता है। यह आदर्श नहीं है ... लेकिन फिर मुझे भी यकीन नहीं था कि एक समर्थन व्यक्ति आवश्यक व्यावसायिक तर्क को कैसे लिख पाएगा, खासकर अगर यह कई अपवादों के साथ जटिल है (जैसा कि संभावना है)।
यदि हम कई, कई नए ग्राहकों को जोड़ते हैं तो यह अच्छा नहीं होगा। यह अपेक्षित नहीं है, लेकिन अगर ऐसा होता है तो हमें कोड के कई अन्य हिस्सों के साथ-साथ इस एक पर भी पुनर्विचार करना होगा।
आप में से रुचि रखने वालों के लिए, आप नाम से एक वर्ग को कॉल करने के लिए जावा प्रतिबिंब का उपयोग कर सकते हैं:
Payment payment = getPaymentFromSomewhere();
try {
String nameOfCustomClass = propertiesFile.get("customClassName");
Class<?> cpp = Class.forName(nameOfCustomClass);
CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();
payment = pp.processPayment(payment);
} catch (Exception e) {
//handle the various exceptions
}
doSomethingElseWithThePayment(payment);