दिलचस्प पोस्ट
स्क्रॉल डाउन पर फ़ेड इन करें, फलक आउट ऑन स्क्रॉल अप – विंडो में तत्व की स्थिति के आधार पर इंस्टॉल किए गए ऐप्स का एपीके प्राप्त करें एक यूनिक्स टाइमस्टैम्प को डेटटाइम और इसके विपरीत कैसे परिवर्तित करें? मैं एक एकल असेंबली में कई असेंबलियों को कैसे मिलाऊं? GitHub से मॉड्यूल को ज्यूपिटर नोटबुक के माध्यम से इंस्टॉल करना क्यों उदाहरण संकलन नहीं करता है, उर्फ ​​कैसे करता है (सह-, अनुबंध-, और इन-) विचरण कार्य? <UITabBarController: 0x197870> के लिए उपस्थिति संक्रमण आरंभ / अंत करने के लिए असंतुलित कॉल AngularJS में कुकीज़ कैसे पहुंचें? प्राथमिकता प्रश्न जोड़ने पर सॉर्ट नहीं करते IllegalStateException: इस कार्रवाई को ViewPager के साथ सेवइन्स्टेंसस्टेट के बाद नहीं कर सकता मैं अपने जार फ़ाइल के अंदर से एक संसाधन "फ़ोल्डर" कैसे प्राप्त करूं? एकाधिक कार्यपत्रकों के साथ एक्सेल में रिपोर्टिंग सेवाएं निर्यात पायथन में ज़िप सूचियां ऑप्टिकल प्रवाह का उपयोग करके ओपनसीवी ट्रैकिंग डीजेंगो में क्वेरी परिणामों को कैशिंग करना

क्यों स्विच / केस और नहीं अगर / अगर अन्यथा?

मुख्य रूप से यह सवाल सी / सी ++ पर बताया, लेकिन मुझे लगता है कि अन्य भाषाएं भी प्रासंगिक हैं।

मुझे समझ में नहीं आ रहा है कि यदि / else if के बजाय स्विच / केस अभी भी उपयोग किया जा रहा है गोटो का इस्तेमाल करना मुझे बहुत पसंद है, और उसी प्रकार के गंदे कोड में नतीजे हैं, जबकि एक ही परिणाम इसके साथ हासिल किया जा सकता है यदि / else यदि अधिक संगठित तरीके से।

फिर भी, मैं इन ब्लॉकों को लगभग अक्सर देखता हूं उन्हें खोजने के लिए एक आम जगह एक संदेश-लूप (WndProc …) के पास है, जबकि ये उन स्थानों में से हैं जब वे भारी तबाही बढ़ाते हैं: चर को पूरे ब्लॉक पर साझा किया जाता है, भले ही मालिकाना नहीं हो (और नहीं हो सकता इसके अंदर आरंभी) अतिरिक्त ध्यान को तोड़ने का नहीं छोड़ना है, और इसी तरह …

निजी तौर पर, मैं उनका उपयोग करने से बचता हूं, और मुझे आश्चर्य है कि मुझे कुछ याद आ रही है?

क्या वे / से अधिक कुशल हैं? क्या वे परंपरा द्वारा किया जाता है?

वेब के समाधान से एकत्रित समाधान "क्यों स्विच / केस और नहीं अगर / अगर अन्यथा?"

मेरी प्रारंभिक पोस्ट और टिप्पणियों का सारांश – if / else कथन पर switch स्टेटमेंट के कई फायदे हैं:

  1. क्लीनर कोड कई else if ... साथ संहिता if / else if ... गन्दा दिखता है और बनाए रखना मुश्किल है – switch क्लीनर संरचना देता है

  2. प्रदर्शन। घने case मानों के लिए कंपाइलर स्पार्सर – बाइनरी सर्च या if / else की श्रृंखला के लिए कूद तालिका उत्पन्न करता else , तो सबसे खराब केस switch में जितना तेज़ if / else , लेकिन आमतौर पर तेज़ी से। हालांकि कुछ कंपलर इसी तरह अनुकूलित कर सकते हैं if / else

  3. टेस्ट ऑर्डर से कोई फर्क नहीं पड़ता। if / else परीक्षणों की श्रृंखला को तेज करने के लिए else को पहले अधिक संभावित मामलों को डाल देना होगा। switch / case प्रोग्रामर के साथ इस बारे में सोचने की ज़रूरत नहीं है

  4. डिफ़ॉल्ट कहीं भी हो सकता है पिछले / बाद के बाद के साथ if / else डिफ़ॉल्ट केस बहुत अंत में होना चाहिए। switchdefault कहीं भी हो सकता है, कहीं भी प्रोग्रामर को यह अधिक उचित लगता है।

  5. सामान्य कोड यदि आपको कई मामलों के लिए आम कोड निष्पादित करने की आवश्यकता है, तो आप break सकते हैं और निष्पादन "के माध्यम से गिर जाएगा" – जो कुछ भी आप के साथ नहीं प्राप्त कर सकते हैं if / else (एक विशेष टिप्पणी रखने के लिए एक अच्छा अभ्यास है /* FALLTHROUGH */ ऐसे मामलों के लिए – लिंट इसे पहचानता है और शिकायत नहीं करता है, इस टिप्पणी के बिना यह शिकायत करता है क्योंकि यह break को भूलने के लिए सामान्य त्रुटि है)।

सभी टिप्पणीकारों के लिए धन्यवाद

ठीक है, एक कारण स्पष्टता है ….

यदि आपके पास एक स्विच / केस है, तो अभिव्यक्ति बदल नहीं सकती …. अर्थात्

 switch (foo[bar][baz]) { case 'a': ... break; case 'b': ... break; } 

जबकि साथ / अगर, यदि आप गलती (या आशय) द्वारा लिखते हैं:

 if (foo[bar][baz] == 'a') { .... } else if (foo[bar][baz+1] == 'b') { .... } 

आपके कोड को पढ़ने वाले लोग आश्चर्यचकित होंगे कि "क्या फू एक्सप्रेशन को समान होना चाहिए", या "वे अलग क्यों हैं"?

कृपया याद रखें कि मामला / चयन अतिरिक्त लचीलापन प्रदान करता है:

  • स्थिति का मूल्यांकन एक बार किया जाता है
  • डफ़ के डिवाइस की तरह चीजें बनाने के लिए पर्याप्त लचीला है
  • गड़बड़ी (उर्फ केस ब्रेक के बिना)

साथ ही यह बहुत तेजी से (जंप / लुकअप तालिका के माध्यम से ) कार्यान्वित करता है * ऐतिहासिक रूप से

यह भी याद रखें कि स्विच स्टेटमेंट आपको नियंत्रण के प्रवाह को जारी रखने की अनुमति देता है, जो आपको कुछ शर्तों के लिए अतिरिक्त कोड जोड़ने की अनुमति देकर शर्तों को अच्छी तरह से संयोजित करने की अनुमति देता है, जैसे कि कोड के निम्नलिखित भाग में:

 switch (dayOfWeek) { case MONDAY: garfieldUnhappy = true; case TUESDAY: case WEDNESDAY: case THURSDAY: case FRIDAY: weekDay = true; break; case SATURDAY: weekendJustStarted = true; case SUNDAY: weekendDay = true; break; } 

इसके बजाय यहां if/else बयानों का उपयोग करना कहीं भी अच्छा नहीं होगा

 if (dayOfWeek == MONDAY) { garfieldUnhappy = true; } if (dayOfWeek == SATURDAY) { weekendJustStarted = true; } if (dayOfWeek == MONDAY || dayOfWeek == TUESDAY || dayOfWeek == WEDNESDAY || dayOfWeek == THURSDAY || dayOfWeek == FRIDAY) { weekDay = true; } else if (dayOfWeek == SATURDAY || dayOfWeek == SUNDAY) { weekendDay = true; } 

यदि बहुत से मामलों में, स्विच स्टेटमेंट क्लीनर लगता है

यह भी अच्छा है जब आपके पास कई मान हैं जिसके लिए आप एक ही व्यवहार चाहते हैं – सिर्फ एक ही कार्यान्वयन में कई "केस" स्टेटमेंट का इस्तेमाल करते हुए पढ़ना आसान है अगर (यह || जो || कुछ और चीज़ || .. ।)

यह आपकी भाषा पर भी निर्भर हो सकता है – उदाहरण के लिए, कुछ भाषाएं केवल संख्यात्मक प्रकारों के साथ काम करती हैं, इसलिए जब आप एन्यूमरेटेड मान, संख्यात्मक स्थिरांक … आदि के साथ काम कर रहे हैं तो यह आपको कुछ टाइपिंग सहेजता है …

 If (day == DAYOFWEEK_MONDAY) { //... } else if (day == DAYOFWEEK_TUESDAY) { //... } //etc... 

या पढ़ने के लिए थोड़ा आसान …

 switch (day) { case DAYOFWEEK_MONDAY : //... case DAYOFWEEK_TUESDAY : //... //etc... } 

स्विच / केस आमतौर पर अगर / अन्य अगर / अन्य से अधिक कुशलतापूर्वक अनुकूलित होता है, लेकिन कभी-कभी (भाषा और संकलक के आधार पर) सरल में अनुवाद किया जाता है यदि / else अगर / अन्य बयान

मैं व्यक्तिगत रूप से सोचता हूं कि स्विच स्टेटमेंट कथन को बयान के एक समूह की तुलना में अधिक पठनीय बनाता है; बशर्ते आप कुछ सरल नियमों का पालन करें। नियम यदि आप / if else / else परिस्थितियों में / else के लिए भी अपना पालन करें, लेकिन फिर से मेरी राय है

उन नियम:

  • कभी भी, कभी भी आपके स्विच ब्लॉक पर एक से अधिक पंक्ति नहीं होती है किसी विधि या फ़ंक्शन को कॉल करें और वहां अपना काम करें।
  • हमेशा ब्रेक / केस फॉलथ्रू की जांच करें
  • बबल अप अपवाद

स्पष्टता। जैसा कि मैंने यहां कहा था , एक संकेत है कि else if समस्याग्रस्त है else if वह है

आवृत्ति जिसके साथ ईएलएसई का उपयोग सिंटैक्स द्वारा की जाने वाली तुलना में अधिक विवश तरीके से किया जाता है I यह लचीलेपन का एक स्लेजहेमर है, जो पूरी तरह से असंबंधित परिस्थितियों को जांचने की अनुमति देता है। लेकिन वैकल्पिक मामलों के साथ समान अभिव्यक्ति की तुलना करते हुए यह मामला मक्खियों को स्वामित्व करने के लिए नियमित रूप से उपयोग किया जाता है …

इससे कोड की पठनीयता कम हो जाती है। चूंकि संरचना सशर्त जटिलता के एक ब्रह्मांड परमिट देती है, इसलिए पाठक को अधिक संभावनाएं ध्यान में रखने की आवश्यकता होती है जब ELSE को पार्स करने से जब मामले को पार्स करने से।

असल में एक स्विच स्टेटमेंट का अर्थ है कि आप उस चीज़ से दूर काम कर रहे हैं जो अधिक से कम एक एन्यूम है जो आपको एक त्वरित संकेत देता है जो चल रहा है।

उस ने कहा, ओ ओ भाषा में किसी भी एनओएम पर एक स्विच संभवतः कोडित किया जा सकता है – और एक श्रृंखला की अगर "अन्य" एक ही "एन्यूम" शैली के मूल्य पर कम से कम के रूप में बुरा और भी अर्थ conveying पर बुरा होगा।

इस चिंता को संबोधित करते हुए कि स्विच के अंदर सब कुछ के बराबर दायरा है, आप हमेशा अपने केस लॉजिक को एक और {} ब्लॉक में डाल सकते हैं, जैसे।

 switch( thing ) { case ONETHING: { int x; // local to the case! ... } break; case ANOTHERTHING: { int x; // a different x than the other one } break; } 

.. अब मैं नहीं कह रहा हूँ कि सुंदर है बस इसे किसी चीज के रूप में डाल देना जो संभव है यदि आप किसी एक मामले में किसी और से अलग करना चाहते हैं।

गुंजाइश के मुद्दे पर एक अन्य सोचा – ऐसा लगता है कि एक समारोह में केवल एक स्विच डालने का अच्छा अभ्यास है, और बहुत कुछ नहीं। उन परिस्थितियों में, चर की गुंजाइश एक चिंता का विषय नहीं है, इस तरह से आप आम तौर पर फ़ंक्शन के किसी भी घोषित करने पर केवल निष्पादन के एक मामले से व्यवहार कर रहे हैं।

ठीक है, स्विचेस पर एक अंतिम विचार: यदि कोई फ़ंक्शन में दो से अधिक स्विच होते हैं, तो संभवत: आपके कोड को रिफैक्टर करने का समय हो। अगर फ़ंक्शन में नेस्टेड स्विचेस शामिल हैं, तो संभवत: आपके डिज़ाइन को थोड़ा सा = पुनर्विचार करने के लिए एक सुराग है)

स्विच मामला मुख्य रूप से प्रोग्रामिंग में बनाया जाने के लिए उपयोग किया जाता है। यह सशर्त बयान से संबंधित नहीं है:

यदि आपके प्रोग्राम को केवल पसंद करने की ज़रूरत होती है तो आप क्यों / दूसरे ब्लॉक का उपयोग करते हैं और प्रोग्रामिंग प्रयास बढ़ाते हैं और कार्यक्रम के निष्पादन की गति को कम करते हैं।

स्विच स्टेटमेंट्स को गति के लिए अनुकूलित किया जा सकता है, लेकिन अधिक मूल्य ले सकते हैं यदि केस मान बड़े पैमाने पर मूल्यों पर फैले हुए हैं।

यदि अन्यथा आम तौर पर धीमा है, क्योंकि प्रत्येक मान की जांच होनी चाहिए।

एक छोटी-छोटी बात दोनों स्विच और अगर-तब-दूसरे की अस्वीकार कर सकती है और ऐसा कुछ लिख सकता है: –

 shortToLongDaysMap := Dictionary new. shortToLongDaysMap at: 'Mon' put: 'Monday'; at: 'Tue' put: 'Tuesday'; at: 'Wed' put: 'Wednesday' etc etc. longForm := shortToLongDaysMap at: shortForm ifAbsent: [shortForm] 

यह एक तुच्छ उदाहरण है लेकिन मुझे आशा है कि आप देख सकते हैं कि बड़ी संख्या में मामलों के लिए यह तकनीक कैसे तराजू है।

दूसरी तर्क को ध्यान दें at:IfAbsent: एक केस स्टेटमेंट के डिफ़ॉल्ट खंड के समान है

इसका मुख्य कारण अनुरक्षणशीलता और पठनीयता है। स्विच / केस बयान के साथ कोड को और अधिक पठनीय और रखरखाव करना आसान है यदि / अन्य क्योंकि आपके पास बहुत से लोग हैं यदि / अन्य तो कोड घोंसला की तरह इतना गन्दा हो गया है और इसे बनाए रखने में बहुत मुश्किल है

और कुछ कैसे निष्पादन समय एक और कारण है।

पूरी तरह से यकीन है कि वे एक ही चीजों को संकलित करते हैं जैसे / else if , लेकिन मुझे switch / case को पढ़ने में आसान लगता है जब 2 या 3 से अधिक हो।