क्या यह "नीति" वर्गों (जैसे रणनीति वर्ग) के लिए बहुत खराब नीति है, केवल एक चीज है?रणनीति पैटर्न और "कार्रवाई" कक्षा विस्फोट
मान लीजिए कि मैं एक राक्षस वर्ग बनाना चाहता हूं। एक वर्ग में राक्षस के बारे में जो कुछ भी मैं चाहता हूं उसे परिभाषित करने के बजाय, मैं यह पहचानने की कोशिश करूंगा कि इसकी मुख्य विशेषताएं क्या हैं, इसलिए मैं उन्हें इंटरफेस में परिभाषित कर सकता हूं। इससे:
- यदि मैं चाहता हूं तो कक्षा को सील करें। बाद में, अन्य उपयोगकर्ता केवल एक नई कक्षा बना सकते हैं और अभी भी परिभाषित इंटरफेस के माध्यम से बहुरूपता है। मुझे चिंता करने की ज़रूरत नहीं है कि कैसे लोग (या खुद) भविष्य में बेस क्लास में सुविधाओं को बदलना/जोड़ना चाहते हैं। सभी वर्ग ऑब्जेक्ट से प्राप्त होते हैं और वे माता-पिता से नहीं, इंटरफेस के माध्यम से विरासत को लागू करते हैं।
- मेरी गेम दुनिया के अन्य सदस्यों के लिए इस राक्षस के साथ उपयोग की जा रही रणनीतियों का पुन: उपयोग करें।
कॉन: यह मॉडल कठोर है। कभी-कभी हम ऐसा कुछ परिभाषित करना चाहते हैं जो आसानी से इस "बिल्डिंग ब्लॉक" को एक साथ रखने की कोशिश करके हासिल नहीं किया जाता है।
public class AlienMonster : IWalk, IRun, ISwim, IGrowl {
IWalkStrategy _walkStrategy;
IRunStrategy _runStrategy;
ISwimStrategy _swimStrategy;
IGrowlStrategy _growlStrategy;
public Monster() {
_walkStrategy = new FourFootWalkStrategy();
...etc
}
public void Walk() { _walkStrategy.Walk(); }
...etc
}
मेरा विचार विभिन्न राक्षसों द्वारा उपयोग की जाने वाली विभिन्न रणनीतियों की एक श्रृंखला बनाने के लिए आगे होगा। दूसरी ओर, उनमें से कुछ का उपयोग पूरी तरह से अलग-अलग उद्देश्यों के लिए भी किया जा सकता है (यानी, मेरे पास एक टैंक हो सकता है जो "तैरता" भी हो)। इस दृष्टिकोण के साथ मैं एकमात्र समस्या देखता हूं कि यह शुद्ध "विधि" वर्गों के विस्फोट का कारण बन सकता है, यानी, रणनीति वर्ग जो कि केवल एक ही उद्देश्य है या यह अन्य कार्य करता है। दूसरी तरफ, इस प्रकार की "मॉड्यूलरिटी" स्ट्रैटजीज के उच्च पुन: उपयोग की अनुमति देगी, कभी-कभी पूरी तरह से अलग संदर्भों में भी।
इस मामले पर आपकी राय क्या है? क्या यह एक वैध तर्क है? क्या यह ओवर-इंजीनियरिंग है?
इसके अलावा, यह मानते हुए हम उदाहरण मैं ऊपर दे दी है के लिए उचित समायोजन करना चाहते हैं, यह के रूप में IWalk परिभाषित करने के लिए बेहतर होगा:
interface IWalk {
void Walk();
}
या
interface IWalk {
IWalkStrategy WalkStrategy { get; set; } //or something that ressembles this
}
जा रहा है कि इस मैं कर रहा मॉन्स्टर पर विधियों को परिभाषित करने की आवश्यकता नहीं होगी, मेरे पास सिर्फ IWalkStrategy के लिए सार्वजनिक गेटर्स होंगे (ऐसा लगता है कि आपको जितना संभव हो उतना सब कुछ encapsulate करना चाहिए!) क्यों?
धन्यवाद
इस तरह से करने के बारे में एक और अच्छी बात यह है कि, जब आप ए से बी में जाना चाहते हैं, तो आप केवल लोकोमोशन इंटरफेस की अपनी सूची में फिर से सक्रिय हो सकते हैं और हार्डकोडिंग की बजाय प्रत्येक लागत से पूछ सकते हैं "चलने की लागत प्राप्त करें; रन लागत प्राप्त करें ; तैरने की लागत पाएं; फ्लाई लागत प्राप्त करें; टेलीपोर्ट लागत प्राप्त करें; ... "और उस सूची को अद्यतन रखने के तकनीकी ऋण को लेकर नए लोकोमोशन प्रकार लागू किए गए हैं। –
क्या आप समझा सकते हैं क्यों चलना, भागो और तैरना आपको इंटरफेस की तुलना में कार्यान्वयन की तरह लग रहा है? आम तौर पर एक इंटरफेस मॉडल कुछ निश्चित वर्ग "कर सकते हैं" नहीं होना चाहिए? इस्विम का मतलब मेरा राक्षस (या टैंक, या जो भी वर्ग मैं लागू करने की कोशिश करता हूं) तैर सकता है। मैं फिर कई अलग-अलग रणनीति वर्गों (उदाहरण के लिए) को लागू कर सकता हूं जैसे स्विमइनवाटर स्विमइनएसिड, आदि। यह क्या है कि मैं यहां याद कर रहा हूं? –
मुझे दोबारा दोहराएं "इंटरफेस वर्णन नहीं करता कि प्रति कुछ क्या कर सकता है।" तार्किक और लगातार फैशन में इंटरफेस का उपयोग करना एक अच्छा विचार है। Growl के लिए ILocomotion का उपयोग करना एक बुरा विकल्प होगा। लेकिन चलना, तैरना, दौड़ना, उड़ना, टेलीपोर्ट, और इसी तरह सभी आंदोलन के रूप हैं। उन्हें एक आंदोलन इंटरफेस में सारण करके आप अपने कोड को बहुत सरल बना सकते हैं। आपके पास इलोकोमोशन का 100 कार्यान्वयन हो सकता है और 20 आईवॉक, 20 इरुन, 20 इस्विम, 20 आईस्किप, 2 आईटेलेपोर्ट, 18 आईजंप कार्यान्वयन से बेहतर हो सकता है। अगर कोई इलोकोमोशन इंटरफ़ेस फिट नहीं करता है तो एक नया इंटरफ़ेस बनाएं। – Felan