2010-02-02 19 views
9

मैं जानना चाहता हूं कि सी # एक्सटेंशन विधि किसी भी मौजूदा डिजाइन पैटर्न पर आधारित है या नहीं।सी # विस्तार विधियां - डिजाइन पैटर्न

+0

विस्तार विधियों का उपयोग न करें, इस प्रविष्टि को देखें एरिक लिपर्ट्स ब्लॉग "foreach V's ForEach" http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

उत्तर

11

एक डिज़ाइन पैटर्न बस एक प्रसिद्ध प्रतिमान है, यानी "जब आप एक्स प्राप्त करना चाहते हैं, तो वाई करें"। ऑब्जेक्ट-उन्मुख भाषाओं जैसे सी # में एक प्रसिद्ध प्रतिमान "जब आप किसी ऑब्जेक्ट की स्थिति पर कार्य करना चाहते हैं, तो इसके उदाहरण पर एक विधि को कॉल करें"।

हालांकि, एक्सटेंशन विधियों के निर्माण से पहले, आप किसी ऑब्जेक्ट के उदाहरण पर अपनी विधि को कॉल नहीं कर सकते थे, जिसे आप कार्यान्वयन नहीं जोड़ सकते थे (उदाहरण के लिए इंटरफ़ेस क्योंकि उनके पास कार्यान्वयन नहीं हो सकते हैं, या लाइब्रेरी कक्षाएं क्योंकि वे पहले ही संकलित हैं)। ऑब्जेक्ट के कार्यान्वयन के लिए बाहरी रूप से परिभाषित किए जाने पर, ऑब्जेक्ट्स के उदाहरणों पर कॉल करने योग्य होने के लिएदिखाई देने के तरीकों को बनाने के लिए एक्सटेंशन विधियां इस अंतर को भरती हैं।

तो हां, तर्कसंगत विस्तार विधियां इस बहुत ही सरल डिज़ाइन पैटर्न पर आधारित हैं, किसी ऑब्जेक्ट की स्थिति पर कार्य करने वाली विधियों को बनाने के लिए इसे एक उदाहरण से कॉल करने योग्य दिखाई देता है।

4

नहीं। यह सिर्फ एक भाषा सुविधा है।

+0

यह दोनों हो सकता है। उदाहरण के लिए, प्रतिनिधि एक सी # भाषा सुविधा है जो प्रकाशक-सब्सक्राइबर पैटर्न को सक्षम बनाता है। – Anthony

0

बेशक आप कुछ डिज़ाइन पैटर्न को कार्यान्वित करना चाहते हैं तो आप सी # एक्सटेंशन विधियों का उपयोग कर सकते हैं। उदाहरण के लिए सी # में mixins अनुकरण।

0

मैं आम डिजाइन पैटर्न के किसी भी रूप में विस्तार के तरीके लेबल होगा नहीं, लेकिन ऐसा लगता है, डेकोरेटर और एडाप्टर आदि पैटर्न लागू करने के लिए इस्तेमाल किया जा सकता ..

1

वे एक मौजूदा डिजाइन पैटर्न पर आधारित नहीं हैं। जब इस 'फीचर' को पहली बार डेल्फी में पेश किया गया था, 'class helpers' नाम के तहत, बोर्लैंड ने उपयोगकर्ताओं को उनसे दूर चेतावनी दी थी। They were considered a bit of a hack, लेकिन अब धूल बस गया है, उन्हें स्वयं का स्थान मिला है।

अन्य सभी की तरह, उचित होने पर उपयोग करें।

1

नहीं, वे नहीं हैं, क्योंकि वे केवल वाक्य रचनात्मक चीनी हैं।

+0

कड़ाई से बोलने वाले विस्तार विधियां _not_ suntactic चीनी हैं। लेकिन उदाहरण विधियों के रूप में उन्हें एक ही वाक्यविन्यास के साथ कॉल करने की आपकी क्षमता है। –

+1

यदि आप मुझ पर विश्वास नहीं करते हैं, तो आप बस इस वाक्यांश में Google को खोजने का प्रयास कर सकते हैं: "विस्तार विधियां वाक्य रचनात्मक चीनी है" और आप सैकड़ों लिंक पा सकते हैं जो मेरी राय साबित करते हैं। –

+1

रून, इस क्षमता विस्तार विधियों के बिना केवल नियमित स्थिर तरीके हैं। "उदाहरण विधियों के रूप में उन्हें समान वाक्यविन्यास के साथ कॉल करने की आपकी क्षमता" * * विस्तार विधियों की एकमात्र विशेषता है, और जैसा कि आपने स्वयं कहा है, यह सुविधा वाक्य रचनात्मक चीनी है। –

8

विस्तार विधियों को Visitor Pattern के प्रतिस्थापन के रूप में माना जा सकता है। यह भी प्रस्तावित किया जाता है कि उन्हें Adapters के रूप में उपयोग किया जा सकता है।

सामान्य भाषाओं में डिज़ाइन पैटर्न की आवश्यकता कम आवश्यक बनाने के लिए विकसित होती है। उदाहरण के लिए एक उद्धरण है कि लिस्प को डिजाइन पैटर्न की आवश्यकता नहीं है, क्योंकि सबकुछ भाषा में बनाया गया है। तो सही सवाल होगा, एक्सटेंशन पैटर्न क्या पैटर्न पैटर्न बदलते हैं?

+1

अधिक सटीक, (अच्छी) भाषा लोकप्रिय डिजाइन पैटर्न के उपयोग को सुव्यवस्थित करने के लिए विकसित होती है। यह भी ध्यान रखें कि आप डिज़ाइन पैटर्न का उपयोग करने से कभी भी दूर नहीं जा सकते हैं, हर डिज़ाइन किसी प्रकार का डिज़ाइन पैटर्न है, डिज़ाइन पैटर्न की भाषा इस विचार को औपचारिक बनाने और कुछ प्रसिद्ध और परीक्षण पैटर्न के उपयोग को बढ़ावा देने का एक तरीका है (उसी तरह एक आर्क या एक बट्रेस वास्तुकला में एक प्रसिद्ध डिजाइन पैटर्न है)। – Wedge

1

नहीं, लेकिन विस्तार विधियां कुछ गोफ डिजाइन पैटर्न (उदा। प्रोटोटाइप) को लागू करने के लिए उत्कृष्ट हैं।

0

विस्तार विधि के लिए सबसे अच्छा मिलान डिजाइन पैटर्न फेकाडे पैटर्न है। मेरा कारण: हम आम तौर पर लक्ष्य वर्ग की ज़िम्मेदारी से परे एक नई कार्यक्षमता पेश नहीं करने के लिए विस्तार विधियों का उपयोग करते हैं, लेकिन मौजूदा लक्ष्य वर्ग उपयोग का उपयोग करके सरलीकृत करते हैं। क्योंकि लक्ष्य वर्ग के उपयोग को सरल बनाना फेकाडे पैटर्न चिंता है, विस्तार विधियों को वैकल्पिक रूप से फेकाडे पैटर्न का उपयोग करके कार्यान्वित किया जा सकता है। विस्तार और इकाई परीक्षण विस्तार विधियों में कुछ समस्याएं हैं। तो मुझे लगता है कि फेकाडे पैटर्न लागू करना विस्तार विधियों का उपयोग करने के खिलाफ एक बेहतर दृष्टिकोण है। हालांकि क्लाइंट कोड के लिए कोडिंग सुविधा प्रदान करने के लिए मुखौटा इंटरफ़ेस को लपेटने वाले कुछ एक्सटेंशन विधियों को लागू करना संभव है।

+0

क्या आप अपना उत्तर विस्तारित करने के लिए विस्तारित कर सकते हैं? – slfan

संबंधित मुद्दे