ज़रूर, लेकिन हम उस रचना और प्रतिनिधिमंडल को बुलाते हैं । रणनीति पैटर्न और निर्भरता इंजेक्शन संरचनात्मक रूप से समान लग सकता है लेकिन उनके इरादे अलग हैं।
रणनीति पैटर्न एक ही इंटरफ़ेस के तहत व्यवहार के क्रम में संशोधन की अनुमति देता है। मैं एक मल्लार्ड बतख को उड़ने और पंखों को देखने के लिए उड़ने को कह सकता था। फिर इसे एक जेट पायलट बतख के लिए स्वैप करें और इसे डेल्टा एयरलाइंस के साथ उड़ते हुए देखें। यह करते हुए कि कार्यक्रम चल रहा है एक रणनीति पैटर्न बात है।
डिपेंडेंसी इंजेक्शन हार्ड कोडिंग निर्भरता से बचने की एक तकनीक है ताकि वे ग्राहकों को बदलने की आवश्यकता के बिना स्वतंत्र रूप से बदल सकें जब वे बदलते हैं। ग्राहक केवल यह जानने के बिना अपनी आवश्यकताओं को व्यक्त करते हैं कि वे कैसे मिलेंगे। इस प्रकार उनकी मुलाकात कैसे होती है इसका निर्णय कहीं और किया जाता है (आमतौर पर मुख्य रूप से)। इस तकनीक का उपयोग करने के लिए आपको दो बत्तखों की आवश्यकता नहीं है। बस कुछ ऐसा जो बतख को बिना जाने या परवाह किए इस्तेमाल करता है। कुछ ऐसा जो बतख का निर्माण नहीं करता है या उसकी तलाश नहीं करता है लेकिन जो भी बतख आपको सौंपता है उसका उपयोग करने के लिए पूरी तरह से खुश है।
अगर मेरे पास एक ठोस बतख वर्ग है तो मैं इसे लागू कर सकता हूं यह मक्खी व्यवहार है। मैं भी इसे एक राज्य चर के आधार पर फ्लाई-टू-विंग्स से फ्लाई-टू-डेल्टा के साथ व्यवहार स्विच कर सकता था। वह चर एक बूलियन, एक इंट हो सकता है, या यह एक FlyBehavior
ऐसा fly
तरीका हो सकता है जो एक ऐसी उड़ान शैली करता है जो मेरे बिना एक उड़ान शैली का परीक्षण करता है। अब मैं बतख के प्रकारों को बदले बिना उड़ान शैलियों को बदल सकता हूं। अब मॉलार्ड पायलट बन सकते हैं। यह रचना और प्रतिनिधिमंडल है । बतख एक फ्लाईबहेवियर से बना है और यह इसे करने के लिए उड़ान अनुरोध सौंप सकता है। आप एक ही बार में अपने सभी बत्तख व्यवहारों को बदल सकते हैं या प्रत्येक व्यवहार या बीच में किसी भी संयोजन के लिए कुछ रख सकते हैं।
इससे आपको वही सारी शक्तियाँ मिलती हैं जो विरासत में एक को छोड़कर होती हैं। वंशानुक्रम आपको अभिव्यक्त करता है कि आप बतख उपप्रकारों में कौन-सी विधियाँ ओवरराइड कर रहे हैं। रचना और प्रतिनिधिमंडल को प्रारंभ से उपप्रकारों को स्पष्ट रूप से सौंपने के लिए बत्तख की आवश्यकता होती है। यह कहीं अधिक लचीला है, लेकिन इसमें अधिक कीबोर्ड टाइपिंग शामिल है और बतख को यह जानना है कि यह क्या हो रहा है।
हालांकि, कई लोगों का मानना है कि विरासत को शुरुआत से ही स्पष्ट रूप से डिजाइन किया जाना चाहिए। और अगर ऐसा नहीं किया गया है, तो आपको विरासत को हटाने के लिए अपनी कक्षाओं को सील / अंतिम के रूप में चिह्नित करना चाहिए। यदि आप उस दृष्टिकोण को लेते हैं, तो वास्तव में रचना और प्रतिनिधिमंडल पर विरासत का कोई लाभ नहीं है। क्योंकि तब या तो आपको शुरुआत से ही एक्स्टेंसिबिलिटी के लिए डिज़ाइन करना होगा या बाद में चीजों को फाड़ने के लिए तैयार रहना होगा।
चीजों को फाड़ना वास्तव में एक लोकप्रिय विकल्प है। बस ध्यान रखें कि ऐसे मामले हैं जहां यह एक समस्या है। यदि आपने स्वतंत्र रूप से पुस्तकालयों या कोड के मॉड्यूलों को तैनात किया है जिसे आप अगली रिलीज़ के साथ अपडेट करने का इरादा नहीं रखते हैं, तो आप उन कक्षाओं के संस्करणों के साथ काम कर सकते हैं जो अब तक आपके बारे में कुछ भी नहीं जानते हैं।
हालांकि बाद में चीजों को फाड़ने के लिए तैयार रहने से आप ओवर डिजाइनिंग से मुक्त हो सकते हैं, कुछ ऐसा डिजाइन करने में सक्षम होने के बारे में बहुत शक्तिशाली है जो बतख का उपयोग किए बिना यह पता करने के लिए करता है कि बतख वास्तव में क्या उपयोग करेगा। यह नहीं जानते कि शक्तिशाली सामान है। यह आपको थोड़ी देर के लिए बतख के बारे में सोचना बंद कर देता है और अपने बाकी कोड के बारे में सोचता है।
"क्या हम कर सकते हैं" और "हमें चाहिए" अलग-अलग प्रश्न हैं। पक्षपात पर अनुकूल रचना यह नहीं कहती है कि उत्तराधिकार का उपयोग कभी न करें। अभी भी ऐसे मामले हैं जहां विरासत सबसे अधिक समझ में आता है। मैं आपको अपना पसंदीदा उदाहरण दिखाऊंगा :
public class LoginFailure : System.ApplicationException {}
वंशानुक्रम आपको केवल एक पंक्ति में अधिक विशिष्ट, वर्णनात्मक नामों के साथ अपवाद बनाने देता है।
रचना के साथ ऐसा करने की कोशिश करें और आपको गड़बड़ मिलेगी। इसके अलावा, वंशानुक्रम यो-यो समस्या का कोई जोखिम नहीं है क्योंकि विरासत के अस्तर का पुन: उपयोग और प्रोत्साहित करने के लिए यहां कोई डेटा या विधियां नहीं हैं। यह सब जोड़ता है एक अच्छा नाम है। एक अच्छे नाम के मूल्य को कभी कम मत समझो।
Duckbehavior.quackBehavior
आपके कोड में और अन्य फ़ील्ड्स के प्रकार क्या हैं ?