स्विच में डिफ़ॉल्ट मामले पर ब्रेक


88

breakआखिरी केस के बाद, जब भी शामिल होता हूं, जब भी शामिल होता हूं या नहीं करता हूं, मैं थोड़ा हैरान हूं default

switch (type) {
    case 'product':

        // Do behavior

        break;
    default:

        // Do default behavior

        break; // Is it considered to be needed?
}

breakएकमात्र उद्देश्य मेरी समझ में कोड के बाकी के माध्यम से चलने से रोकने के लिए है switch

क्या यह तब अधिक तार्किक माना जाता है कि एक breakसामंजस्य के कारण अंतिम होना या इसे breakलागू करने के कारण इसे छोड़ना जो किसी भी कार्यात्मक उपयोग के लिए नहीं है? मेरी राय में दोनों अलग-अलग तरीकों से तार्किक हैं।

यह कुछ हद तक एक .phpफ़ाइल को समाप्त करने के साथ तुलना की जा सकती है ?>?>रिक्त स्थानों के आउटपुट के जोखिम के कारण मैं कभी भी समाप्त नहीं होता, लेकिन कोई यह तर्क दे सकता है कि फ़ाइल को समाप्त करना तर्कसंगत बात होगी।

जवाबों:


144

breakअंतिम विकल्प के बाद तकनीकी रूप से आवश्यक नहीं है (जो, आपके मन में, आपके पास नहीं है default: यह पूरी तरह से कानूनी है, और कभी-कभी defaultशाखा को पहले रखने के लिए भी उपयोगी है ); क्या आपका कोड switchस्टेटमेंट के अंत में आता है या breaksउसकी अंतिम शाखा के अंत में परिणाम समान होता है।

हालाँकि, मैं अभी भी हर शाखा को समाप्त करूँगा, जिसमें अंतिम एक, returnया एक breakबयान के साथ, तीन कारणों से शामिल है:

  1. Refactorability। यदि आपकी सभी शाखाएँ समाप्त हो जाती हैं breakया return, आप अर्थ को बदले बिना उन्हें पुनः व्यवस्थित कर सकते हैं। यह एक प्रतिगमन शुरू करने के लिए इस तरह के पुनरावर्तन के लिए कम संभावना बनाता है।
  2. संगति, और कम से कम आश्चर्य। संगति कहती है कि आपकी शाखाओं को लगातार समाप्त होना चाहिए, जब तक कि वे वास्तव में अर्थ में भिन्न न हों। लैटर सरप्राइज़ का सिद्धांत निर्धारित करता है कि समान चीजों को समान दिखना चाहिए। switchब्लॉक की अंतिम शाखा को ठीक उसी तरह समाप्त करना जैसे पूर्ववर्ती दोनों को पूरा करता है, जिससे पढ़ने और समझने में आसानी होती है। यदि आप स्पष्ट छोड़ देते हैं break, तो अंतिम शाखा वैकल्पिक रूप से भिन्न होगी (जो त्वरित स्कैनिंग के लिए विशेष रूप से महत्वपूर्ण है), और यह देखने के लिए कि यह वास्तव में अलग नहीं है, पाठक को अलग-अलग बयान पढ़ने के नीट-ग्रिट्टी स्तर तक उतरना होगा ।
  3. अपनी रक्षा करना। यदि आप अपनी सभी switchशाखाओं को ए के साथ समाप्त करने की आदत डालते हैं break, तो यह थोड़ी देर के बाद स्वचालित हो जाएगा, और आपको गलती से इसे भूल जाने की संभावना कम होगी जहां यह कोई फर्क नहीं पड़ता। breakप्रत्येक शाखा के अंत में उम्मीद करने के लिए खुद को प्रशिक्षित करना भी लापता breakबयानों का पता लगाने में मदद करता है , जो डिबगिंग और समस्या निवारण के लिए बहुत अच्छा है।

इस में आपकी अंतर्दृष्टि के लिए धन्यवाद! विल breakमामले में अच्छी तरह से :) पिछले
रॉबिन Castlin

7
अंतिम विकल्प के बाद तकनीकी रूप से आवश्यक C #, break(या अन्य नियंत्रण-प्रवाह विवरण case) से बाहर है
dan04

3
@ dan04: हाँ, अच्छी बात है। सी # यहां एक अपवाद है, और यह शायद इसलिए है क्योंकि भाषा डिजाइनर switchमौजूदा भाषाओं में गिरावट के माध्यम से समस्याओं के बारे में जानते थे और उन्हें रोकना चाहते थे। C # के नियम मेरे जवाब से सिफारिशों से बहुत मेल खाते हैं।
तदमर्स

आप किस भाषा के बारे में विशेष रूप से बात कर रहे हैं? सी? सी ++? सी#? जावा? पीएचपी?
svick

2
एक अच्छा संकलक , अगले निर्देश को सही breakबनाने के बजाय एनओ-ओपी के रूप में फाइनल का इलाज करेगा jmp?
नाथन उस्मान

11

switch-caseअधिकांश भाषाओं के उपयोग के आस-पास मौजूद अस्पष्टता को देखते हुए , इसका उपयोग करते समय मैं हमेशा एक breakबयान का उपयोग करने का सुझाव दूंगा, सिवाय इसके कि जब यह स्पष्ट रूप से और डिजाइन द्वारा नहीं चाहता था

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


7
जब मैं चाहता हूँ कि एक मामला अगले पड़ने के लिए (और यह पतित मामला नहीं है case foo: case bar: ...) तो मैं एक स्पष्ट टिप्पणी करता हूँ कि मैं चाहता हूँ कि पतन घटित हो। इसे बहुत स्पष्ट बनाता है।
डोनल फेलो

3
हाँ एक सरल टिप्पणी की तरह // no breakके स्थान परbreak;
Pacerier

या [[fallthrough]]C ++ के मामले में एक विशेषता।
रुस्लान

1

आखिरी केस के breakबाद कोई जरूरी नहीं है । मैं " अंतिम " शब्द का उपयोग करता हूं ( डिफ़ॉल्ट नहीं ) क्योंकि यह आवश्यक नहीं है डिफ़ॉल्ट मामला अंतिम मामला है।

switch(x)
{
case 1:
//do stuff
break;

default:
//do default work
break;

case 3:
//do stuff

}

और हम जानते हैं, break लगातार दो के बीच एक आवश्यक है case। कभी-कभी, मैं if(a!=0)अपने कोड में अधिक पठनीयता के लिए उपयोग करता हूं जब अन्य लोग मेरे कोड का संदर्भ देते हैं। मैं उपयोग करने का विकल्प चुन सकता हूं if(a), यह मेरी पसंद की बात होगी


5
मेरे लिए इसका मतलब होगा "हमेशा ब्रेक का उपयोग", बस अगर किसी प्रोग्रामर ने caseआपकी switchजाँच के बिना एक नया जोड़ा कि breakमौजूद नहीं था (यह उस प्रोग्रामर की गलती होगी, लेकिन फिर भी किसी भी कारण से सुरक्षित रहना बेहतर है, क्योंकि आप 6
महीने

@ SJuan76 हाँ, मैं सहमत हूँ, खेद से बेहतर सुरक्षित है, यदि आप भविष्य की त्रुटियों के लिए सुरक्षा रखना चाहते हैं, तो आपको अंत में एक को शामिल करना होगा।
सुवर्णा पट्टयिल

1
उस तर्क को ध्यान में रखते हुए, , यदि कोई नया मान डाला जाता है, तो आप हमेशा बकाया होने के तर्क दे सकते हैं । हालाँकि यह कुछ कोड को तोड़ता है और आम तौर पर बदसूरत दिखता है :)
रॉबिन कास्टलिन

1
@ रॉबिन कोमा में डालना अलग बात है। यदि यह नहीं है और कोई व्यक्ति किसी सरणी में एक नया मान जोड़ता है तो उन्हें एक संकलन त्रुटि मिलेगी। हालांकि, कोई संकलित त्रुटि नहीं होगी यदि पिछले मामले के बयान में कोई कमी है - तो यह संभव होगा कि यह छूट जाए और रन-टाइम त्रुटियों का कारण बने।
कीथ मिलर

@RobinCastlin बशर्ते कि भाषा आपको ए लगाने की अनुमति दे ,। Incase, defaultअंतिम केस होने के लिए डिज़ाइन किया गया था। हो सकता है कि भाषा इसके breakबाद एक त्रुटि के रूप में विचार करेगी । breakकेवल दो मामलों के बीच एक विभेदक के रूप में मान लिया गया था।
सुवर्णा पट्टयिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.