मैं एक विरासत जावा एप्लिकेशन पर काम कर रहा हूं, जो कि "फलों" और "सब्जियों" से संबंधित है, मान लीजिए, प्रश्न के लिए। उन्हें आंतरिक रूप से अलग-अलग चीजों के रूप में माना जाता है, क्योंकि उनके पास सभी विधियों/गुणों में आम नहीं है, लेकिन उनमें से कई चीजें बहुत समान हैं।इससे निपटने के लिए उचित डिजाइन क्या है?
तो, हम तरीकों में से एक टन है doSomethingWithAFruit (फल च) और doSomethingWithAVegetable (शाकाहारी v), कि का उपयोग उचित doOtherStuffWithAFruit (फल च)/doOtherStuffWithAVeg (शाकाहारी v)। और वे बहुत समान हैं, उन तरीकों को छोड़कर जो फल के साथ चीजें करते हैं केवल उन तरीकों को बुलाते हैं जो फल के साथ चीजें करते हैं, और सब्जियों के लिए एक ही चीज़ है।
मैं डुप्लिकेशंस को कम करने के लिए इसे पुन: सक्रिय करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसे पूरा करने का सबसे अच्छा तरीका क्या है। मैंने कुछ डिज़ाइन पैटर्न के बारे में कुछ पढ़ा है, लेकिन मुझे नहीं पता कि यह मेरे लिए कोई स्पष्ट है या नहीं। (मैं अपने द्वारा उपयोग किए जाने वाले कोड में कुछ पैटर्न पहचान सकता हूं, लेकिन मुझे वास्तव में पता नहीं है कि मुझे चीजों को बेहतर बनाने के लिए एक पैटर्न लागू करना चाहिए। शायद मुझे खुद को रिफैक्टर करने के बारे में और अधिक पढ़ना चाहिए ...)
मैं था इन दो विकल्पों के बारे में सोच:
1. एक ऐसी कक्षा बनाना जिसमें फल या सब्जियों का उदाहरण हो और इसे डुप्लिकेशंस को कम करने की कोशिश कर रहे तरीकों तक पहुंच जाए। यह इस तरह होगा:
public void doSomething(Plant p) {
// do the stuff that is common, and then...
if (p.hasFruit()) {
doThingWithFruit(p.getFruit());
} else {
doThingWithVegetable(p.getVegetable());
}
}
इससे चीजें थोड़ा बेहतर हो जाएंगी, लेकिन मुझे नहीं पता ... यह अभी भी गलत लगता है।
2. दूसरा विकल्प मैंने सोचा था कि फलों और सब्जियों में उनके लिए आम चीजों के साथ एक इंटरफेस डालना था, और इसे पारित करने के लिए इसका उपयोग करना था। मुझे लगता है कि यह क्लीनर दृष्टिकोण है, हालांकि मुझे instanceof
का उपयोग करना होगा और फल/सब्जी के लिए डालना होगा जब उन्हें उन चीजों की आवश्यकता होती है जो उनके लिए विशिष्ट हैं।
तो, मैं यहां और क्या कर सकता हूं? और इन दृष्टिकोणों की कमी क्या हैं?
अद्यतन: ध्यान दें कि प्रश्न थोड़ा सा सरल है, मैं "पौधों" के साथ चीजों को करने का तरीका ढूंढ रहा हूं, यानी कोड, जो उन्हें चीजों को करने के बजाए अधिकतर "उपयोग" करता है। करने के बाद कहा कि, उन समान तरीकों मैं उल्लेख करने के लिए "संयंत्रों" वर्गों के अंदर नहीं किया जा सकता, और वे आमतौर पर एक और तर्क है, जैसे:
public void createSomethingUsingFruit(Something s, Fruit f);
public void createSomethingUsingVegetable(Something s, Vegetable v);
अर्थात् उन तरीकों के अलावा फल/सब्जियों में अन्य चिंताएं हैं, और 'नहीं कर रहे वास्तव में किसी भी फल/सब्जी वर्ग में होने के लिए विनियमित नहीं है।
अद्यतन 2: उन तरीकों में अधिकांश कोड केवल फल/सब्जी वस्तुओं से राज्य पढ़ता है, और अन्य वर्गों के उदाहरण, डेटाबेस में इतने पर उचित प्रकार के अनुसार बनाने की दुकान और - करने के लिए अपने जवाब से टिप्पणियों में एक सवाल है कि मुझे लगता है कि यह महत्वपूर्ण है।
क्या होगा यदि पौधे फल या सब्जी नहीं है? –
मुझे लगता है कि आपको एक सामान्य इंटरफ़ेस की ओर बढ़ने का सही विचार है। संग्रह पर भी पढ़ें। संभवतया प्रकार की एक श्रेणी बनाएं जो किसी भी तरीके, ऑब्जेक्ट्स, वैरिएबल को परिभाषित करने के लिए आपको के रूप में लचीला होने की आवश्यकता है और फिर अपने मुख्य/रनटाइम में उस कंक्रीट को बनाना। –
यदि आप दोनों के लिए सामान्य कार्यों को लागू कर सकते हैं (आपके द्वारा उल्लिखित डुप्लिकेट के आधार पर मानते हुए), तो अमूर्त वर्ग का उपयोग करना बेहतर है क्योंकि आप इसे कक्षा में कार्यान्वित कर सकते हैं जो निश्चित रूप से सबक्लास पर डुप्लिकेट कोड को कम करेगा। – Jimmy