switch
बयान और बहुरूपता दोनों का उपयोग है। ध्यान दें कि एक तीसरा विकल्प भी मौजूद है (उन भाषाओं में जो फ़ंक्शन पॉइंटर्स / लैम्ब्डा और उच्च-क्रम फ़ंक्शन का समर्थन करते हैं): हैंडलर फ़ंक्शन के लिए पहचानकर्ताओं को प्रश्न में मैप करना। यह उदा C में उपलब्ध है जो OO भाषा नहीं है, और C # जो कि * है, लेकिन जावा में (अभी तक) नहीं है जो OO भी है *।
कुछ प्रक्रियात्मक भाषाओं में (कोई बहुरूपता नहीं है और न ही उच्च-क्रम के कार्य) switch
/ if-else
कथन समस्याओं के एक वर्ग को हल करने का एकमात्र तरीका थे। इसलिए कई डेवलपर्स, इस तरह से सोचने के आदी रहे, switch
उन्होंने ओओ भाषाओं में भी उपयोग करना जारी रखा , जहां बहुदेववाद अक्सर एक बेहतर समाधान होता है। यही कारण है कि अक्सर switch
बहुरूपता के पक्ष में बयानों से बचने / रिफ्लेक्टर करने की सिफारिश की जाती है।
किसी भी दर पर, सबसे अच्छा समाधान हमेशा मामला निर्भर है। सवाल यह है कि कौन सा विकल्प आपको लंबे समय में क्लीनर, अधिक संक्षिप्त, अधिक रखरखाव योग्य कोड देता है?
स्विच स्टेटमेंट अक्सर अनजाने में बढ़ सकते हैं, दर्जनों मामलों में, उनके रखरखाव को कठिन बना सकते हैं। चूंकि आपको उन्हें एक ही फंक्शन में रखना है, इसलिए यह फंक्शन बहुत बड़ा हो सकता है। यदि यह मामला है, तो आपको एक मानचित्र आधारित और / या बहुरूपी समाधान की ओर फिर से विचार करना चाहिए।
यदि एक ही switch
कई स्थानों पर पॉप अप करना शुरू हो जाता है, तो इन सभी मामलों को एकजुट करने और कोड को सरल बनाने के लिए बहुरूपता शायद सबसे अच्छा विकल्प है। खासकर अगर भविष्य में और मामले जुड़ने की उम्मीद है; जितनी अधिक बार आपको हर बार अपडेट करने की आवश्यकता होगी, त्रुटियों के लिए उतनी अधिक संभावनाएं। हालाँकि, अक्सर व्यक्तिगत मामले संचालकों के लिए बहुत सरल होते हैं, या उनमें से बहुत सारे होते हैं, या वे इतने परस्पर जुड़े होते हैं, कि उन्हें एक पूर्ण बहुरूपी वर्ग पदानुक्रम में बदलकर ओवरकिल हो जाता है, या बहुत सारे डुप्लिकेट कोड और / या उलझा हुआ होता है, वर्ग पदानुक्रम बनाए रखने के लिए कठिन है। इस मामले में, इसके बजाय फ़ंक्शंस / लैम्ब्डा का उपयोग करना सरल हो सकता है (यदि आपकी भाषा आपको अनुमति देती है)।
हालाँकि, यदि आपके पास एक switch
ही जगह है, केवल कुछ मामलों में कुछ सरल करने के साथ, यह अच्छी तरह से इसे छोड़ने का सबसे अच्छा समाधान हो सकता है जैसा कि यह है।
* मैं "OO" शब्द का प्रयोग यहाँ करता हूँ; मुझे "वास्तविक" या "शुद्ध" OO क्या है, इस पर वैचारिक बहस में कोई दिलचस्पी नहीं है।