2012-03-11 6 views
16

मैंने कुछ समय बिताया है, क्लोजर multimethods को समझने की कोशिश कर रहा है। जहां तक ​​मैं समझता हूं, मुख्य "समर्थक" multimethod तर्क, उनकी लचीलापन है, हालांकि, मैं इस तर्क के साथ उलझन में हूं कि क्यों बहुआयामी सरल या केस स्टेटमेंट से बेहतर हैं। क्या कोई, कृपया, समझा सकता है, पॉलिमॉर्फिज्म और एक अतिरंजित केस स्टेटमेंट के बीच की रेखा कहां खींची गई है?क्लोजर के बहु-तरीके 'if' या 'case' कथन से बेहतर क्यों हैं

संपादित करें: मुझे इस प्रश्न में स्पष्ट होना चाहिए था कि मुझे 'if' कथन की तुलना में अधिक दिलचस्पी है। उत्तर के लिए बहुत बहुत धन्यवाद!

+0

यदि कोई कथन और अतिव्यापी गोटो के बीच की रेखा खींची गई है? – Kevin

+1

आपको रुचि हो सकती है http://stackoverflow.com/q/5986120/625403, जो वास्तव में एक डुप्लिकेट नहीं है लेकिन निकट से संबंधित है। – amalloy

उत्तर

16

multimethods और एक बड़ा if-statement के बीच का अंतर यह है कि आपको उस फ़ंक्शन को संशोधित करने की आवश्यकता है जिसमें केस-स्टेटमेंट को if-statement में जोड़ने के लिए केस-कथन शामिल है। आप पहले मौजूदा तरीकों को छूए बिना एक नई विधि जोड़ सकते हैं।

तो यदि आप अपनी लाइब्रेरी के अंदर एक बहुआयामी परिभाषित करते हैं और आप चाहते हैं कि आपके उपयोगकर्ता इसे अपने डेटा प्रकारों के लिए विस्तारित कर सकें, तो कोई समस्या नहीं है। यदि आपने इसके बजाय एक if-statement का उपयोग किया था, तो यह एक बड़ी समस्या होगी।

+0

आह, यह वास्तव में कुछ है जो मुझे अच्छी तरह से समझ में नहीं आया, धन्यवाद! तो, बहुआयामी नामस्थान तक सीमित नहीं हैं जहां defmulti घोषित किया गया था? – Iger

+0

@Iger यह सही है। – sepp2k

23

कहें कि हमारे पास ए, बी, सी, डी और ई, और विधियों एम 1, एम 2, एम 3 पिछले प्रकार के एकल तर्क लेते हैं। आप उन्हें इस तरह की तालिका में रख सकते हैं:

| A | B | C | D | E | 
m1 | | | | | | 
m2 | | | | | | 
m3 | | | | | | 

"स्विच" कथन रणनीति एक समय में इस तालिका की एक पंक्ति को कार्यान्वित कर रही है। मान लीजिए कि आप एक नया प्रकार एफ जोड़ते हैं। आपको इसका समर्थन करने के लिए सभी कार्यान्वयन को संशोधित करना होगा।

कक्षा-आधारित पॉलीमोर्फिज्म (सी ++, जावा, आदि) आपको इसके बजाय एक संपूर्ण कॉलम लागू करने की अनुमति देता है। एक नया प्रकार जोड़ना इतना आसान है, क्योंकि आपको पहले से परिभाषित कक्षाओं को बदलने की ज़रूरत नहीं है। लेकिन एक नई विधि जोड़ना कठिन है, क्योंकि आपको इसे अन्य सभी प्रकारों में जोड़ना होगा।

बहुआयामी आपको तालिका के एकल कोशिकाओं को स्वतंत्र रूप से एक-दूसरे से लागू करने की अनुमति देते हैं।

यदि आपको कई तर्कों पर प्रेषण करना है तो यह लचीलापन भी अधिक है। प्रत्येक नया तर्क इस तालिका में एक और आयाम जोड़ता है, और दोनों स्विच-आधारित और कक्षा-आधारित प्रेषण बहुत जटिल हो जाते हैं (सी.एफ. विज़िटर पैटर्न)।

नोट, कि बहुआयामी वास्तव में चित्रित की तुलना में अधिक सामान्य हैं, क्योंकि आप तर्कों के प्रकारों पर नहीं, बल्कि बहुत कुछ भी भेज सकते हैं।

1

ऊपर ivant का उत्तर this article पर एक नज़र डालकर विस्तारित किया जा सकता है। यह प्रोटोकॉल की शक्ति को समझाने का एक अच्छा काम करता है। कई आयामों के साथ प्रोटोकॉल के रूप में multimethods के बारे में सोचें।

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