रणनीति का पैटर्न बहुत बड़ा होने से बचने के लिए अच्छा काम करता है ... अन्यथा निर्माण और कार्यक्षमता को जोड़ना या बदलना आसान बनाता है। हालाँकि, यह अभी भी मेरी राय में एक दोष छोड़ देता है। ऐसा लगता है कि हर कार्यान्वयन में अभी भी एक ब्रांचिंग निर्माण की आवश्यकता है। यह एक कारखाना या डेटा फ़ाइल हो सकती है। एक उदाहरण के रूप में एक आदेश प्रणाली लेते हैं।
फैक्टरी:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
इसके बाद के कोड को चिंता करने की आवश्यकता नहीं है, और अब नए ऑर्डर प्रकार को जोड़ने के लिए केवल एक ही जगह है, लेकिन कोड का यह खंड अभी भी उपलब्ध नहीं है। इसे डेटा फ़ाइल में खींचने से पठनीयता में कुछ हद तक मदद मिलती है (बहस योग्य, मुझे पता है):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
लेकिन यह अभी भी डेटा फ़ाइल को संसाधित करने के लिए बॉयलरप्लेट कोड जोड़ता है - दी गई, अधिक आसानी से इकाई परीक्षण योग्य और अपेक्षाकृत स्थिर कोड, लेकिन फिर भी अतिरिक्त जटिलता।
इसके अलावा, इस तरह का निर्माण एकीकरण परीक्षण को अच्छी तरह से नहीं करता है। प्रत्येक व्यक्तिगत रणनीति को अब परीक्षण करना आसान हो सकता है, लेकिन आपके द्वारा जोड़ी गई प्रत्येक नई रणनीति परीक्षण के लिए जटिलता है। यदि आपने पैटर्न का उपयोग नहीं किया है तो यह आपके मुकाबले कम होगा , लेकिन यह अभी भी है।
क्या इस जटिलता को कम करने वाले रणनीति पैटर्न को लागू करने का एक तरीका है? या यह बस के रूप में के रूप में सरल है, और आगे जाने की कोशिश केवल अमूर्त की एक और परत जोड़ने के लिए थोड़ा कोई फायदा नहीं होगा?
eval
... जावा में काम नहीं कर सकते हैं, लेकिन शायद अन्य भाषाओं में?