मेरे पास एक डिज़ाइन समस्या है जिसे मैं हल करना चाहता हूं। मेरे पास एक इंटरफ़ेस है, इसे IProtocol
पर कॉल करें, जिसे दो अलग-अलग वर्गों द्वारा कार्यान्वित किया जाता है। हम यहाँ कोड की 600 से अधिक लाइनों को देख रहे हैं।डिज़ाइन समस्या - विरासत इस कोड को सरल बनाने का सही तरीका है?
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
और
: सामान वे करते हैं के विशाल बहुमत, कुछ विशिष्ट क्षेत्रों के लिए को छोड़कर, एक ही हैpublic class Protocol2 : IProtocol { MyInterfaceMethod1() { Same1(); Same2(); } }
DiffStuff();
वर्तमान संरचना की तरह कुछ इस तरह है
मैं होने कॉपी-पेस्ट त्रुटियों और टी के साथ चिंतित हूँ यदि मैं दो प्रोटोकॉल अलग रखता हूं तो वह कोड डुप्लिकेशन का क्लासिक समस्या है। हम प्रत्येक कोड की पूर्ण 600 लाइनों के बारे में बात कर रहे हैं, कुछ सरल तरीकों से नहीं।
मैं (Protocol2 ज्यादातर एक ही रहने को छोड़कर मैं निजी तरीकों में Same1()
और Same2()
रैप करने के लिए होगा होगा।)
public class Protocol1 : Protocol2
{
void Same1()
{
base.Same1();
}
void Same2()
{
base.Same2();
}
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Protocol1 के कार्यान्वयन को बदलने protocol2 से प्राप्त करना इस तरह, पर विचार कर रहा हूँ क्या इस समस्या से निपटने के लिए यह सही तरीका है?
संपादित करें: कई लोगों ने मुझे इस प्रश्न के साथ मदद की, स्पष्ट समझ के लिए धन्यवाद। मेरे मामले में, दोनों ऑब्जेक्ट्स एक ही प्रकार के नहीं हैं, भले ही उनके अधिकांश कार्यान्वयन को साझा किया गया हो, इसलिए मैं कक्षाओं के बीच परिवर्तनों को समाहित करने के लिए छोटे तरीकों का निर्माण करने के लिए अमूर्त बेस क्लास का उपयोग करने के लिए Bobby's suggestion के साथ गया। करने के लिए अतिरिक्त धन्यवाद:
- jloubert
- हंस Passant
- जेफ स्टर्नल
एक अमूर्त वर्ग है कि आवश्यक जो कि लागू नहीं किया जाता है के लिए साझा तरीकों और अमूर्त परिभाषाओं को परिभाषित करता है क्यों उपयोग नहीं ? – alternative
रॉबेट सी मार्टिन –
द्वारा "क्लीन कोड" पर नज़र डालें, यदि आपको वास्तव में समझ में आता है तो आपको केवल 'प्रोटोकॉल 1' से 'प्रोटोकॉल 1' प्राप्त करना चाहिए। आपको पूछने की जरूरत है, "क्या हर प्रोटोकॉल 1 प्रोटोकॉल 2 का एक उदाहरण भी है, उसी अर्थ में कि हर बिल्ली एक स्तनधारी है?" यदि वे हैं, तो आप जो सोच रहे हैं वह करें। यदि नहीं, तो बॉबी के जवाब में दिखाए गए अनुसार, मैं एक सार आधार श्रेणी के साथ जाऊंगा। – jloubert