घोषणा ChildBuilder extends BaseBuilder<ChildBuilder>
किसी तरह एक कोड गंध को इंगित करता है और सूखी का उल्लंघन हो रहा है। इस उदाहरण में BaseBuilder
केवल ChildBuilder
के साथ parametrized किया जा सकता है और कुछ भी नहीं, तो यह अनावश्यक होना चाहिए।
मैं इस बात पर पुनर्विचार करना चाहूंगा कि मैं वास्तव में इसे अधिक आर्किटेक्चर करना चाहता हूं और मैं बाल बिल्डरों से सभी विधियों को BaseBuilder
में डालने का प्रयास करूंगा। तो मैं चेनिंग का समर्थन करने वाले सभी तरीकों से this
वापस कर सकता हूं।
यदि मुझे अभी भी लगता है कि मुझे बिल्डर विधियों के विशिष्ट समूहों को अपने वर्गों में अलग करके लाभ होगा, तो मैं संरचना को वरीयता दूंगा, क्योंकि केवल कोड पुन: उपयोग के लिए विरासत लागू करने की अनुशंसा नहीं की जाती है।
मान लीजिए हम BaseBuilder
की दो उपवर्गों है:
class BuilderA extends BaseBuilder<BuilderA> {
BuilderA buildSomethingA() { return this; }
}
class BuilderB extends BaseBuilder<BuilderB> {
BuilderB buildSomethingB() { return this; }
}
क्या होगा अगर जरूरत श्रृंखला buildSomethingA
और buildSomethingB
की तरह करने के लिए पैदा होता है:
builder.buildSomething().buildSomethingA().buildSomethingB();
हम ले जाए बिना यह करने के लिए सक्षम नहीं होगा BaseBuilder
के लिए subclass विधियों; लेकिन कल्पना करें कि BuilderC
भी है जिसके लिए वे विधियां समझ में नहीं आती हैं और उन्हें से विरासत में नहीं मिला जाना चाहिए।
यदि हम फिर भी इन दो विधियों को सुपरक्लास में ले जाते हैं, और अगली बार तीन अन्य विधियों और अगली बार ... हम पूरे पदानुक्रम के 9 0% कर्तव्यों के लिए जिम्मेदार सुपरक्लस के साथ समाप्त होंगे जैसे:
builder.buildSomething1().buildSomething2()
.builderA()
.buildSomethingA1().buildSomethingA2()
.end()
.buildSomething3()
.builderB()
.buildSomethingB()
.end();
यहाँ end()
रिटर्न builder
उदाहरण ताकि आप अपने तरीकों में से श्रृंखला अधिक कर सकते हैं या एक नया उप-बिल्डर शुरू:
if ((this instanceof BuilderB) && !flag1 && flag2) {
...
} else if ((this instanceof BuilderC) && flag1 && !flag2 && thing != null) {
...
} else if ...
समाधान मैं और अधिक की तरह की तरह एक डीएसएल है।
इस तरह (उप) बिल्डर्स जो कुछ भी चाहते हैं उससे प्राप्त कर सकते हैं (अन्यथा उन्हें केवल BaseBuilder
का विस्तार करना होगा) और उनके स्वयं के सार्थक पदानुक्रम या रचनाएं हो सकती हैं। के बाद से निम्नलिखित वर्ग संकलन होगा # 3 विकल्प में
यह सार्वजनिक वर्ग बेसबिल्डर नहीं होना चाहिए सामान्य प्रकार एक ही कक्षा का जिक्र क्यों कर रहा है? => चाइल्डबिल्डर बेसबिल्डर <चाइल्डबिल्डर> –
6ton
@ 6ton बढ़ाता है, क्योंकि केवल वैध जेनेरिक प्रकार बेसबिल्डर का उत्तराधिकारी हैं। उदाहरण के लिए 'बेसबिल्डर' समझ में नहीं आता है। –
अभी भी सुनिश्चित नहीं है कि आपको हस्ताक्षर की आवश्यकता क्यों है - मैंने औचित्य – 6ton