जावा स्विच के मामले: ब्रेसिज़ के साथ या उसके बिना?


85

निम्नलिखित दो स्निपेट पर विचार करें, जिसमें ब्रेसिज़ हैं:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

ब्रेसिज़ के बिना:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

मुझे पता है कि, ब्रेसिज़ के साथ स्निपेट में, प्रत्येक केस को ब्रेसिज़ में संलग्न करके एक नया स्कोप बनाया जाता है। हालाँकि, यदि प्रत्येक मामले में नए स्कोप की आवश्यकता नहीं है (अर्थात कोई परिवर्तनीय नामों का पुन: उपयोग नहीं किया जा रहा है), तो क्या किसी केस के साथ ब्रेसिज़ का उपयोग करने के लिए किसी प्रकार का प्रदर्शन दंड है?

जवाबों:


99

क्या किसी केस के साथ ब्रेसिज़ का उपयोग करने के लिए किसी प्रकार का प्रदर्शन दंड है?

कोई नहीं।

घुंघराले ब्रेसिज़ संकलक को एक चर, स्थिति, फ़ंक्शन घोषणा इत्यादि के दायरे से बाहर निकालने में मदद करने के लिए हैं, यह कोड निष्पादन में संकलित होने के बाद रनटाइम प्रदर्शन को प्रभावित नहीं करता है।


21

निष्पादन के दृष्टिकोण से कोई प्रदर्शन जुर्माना नहीं।

एक संक्षिप्त बिंदु से थोड़ा सा प्रदर्शन जुर्माना, क्योंकि पार्स करने के लिए अधिक है, लेकिन अगर किसी को वास्तव में इसके बारे में चिंतित थे कि उन्हें एक पंक्ति में अपना कोड लिखना होगा :-)

और अब हमारे पोस्ट के राय भाग के लिए ... मैं हमेशा {और} में रखता हूं क्योंकि इसमें स्थिरता के लिए एक दंड है कि आपको बाद में उन्हें तारीख पर रखना होगा, और यह उन्हें डाल दर्द हो सकता है बाद में ... लेकिन यह 103% व्यक्तिगत प्राथमिकता है।


मैं थोड़ा उत्सुक हूं क्योंकि मैं खुद जवाब नहीं देख सकता ... @TofuBeer, जब आप ब्रेसेस को जोड़ना चाहते हैं? इसके अलावा, मैं पूरी तरह से बनाए रखने के बिंदु से सहमत हूं, मैं अभी रखरखाव की समस्या को नहीं देखता हूं। संपादित करें: कभी नहीं। मैं बस नीचे दिए गए बाकी जवाबों को पढ़ता हूं।
नयार

आप कुछ मामलों में C ++ में करते हैं, इसलिए यदि आप दोनों भाषाओं में काम करते हैं, तो इसमें शामिल होने की बुरी आदत नहीं है।
टोफूबीर

13

जैसा कि हम जानते हैं कि स्विच मामलों के लिए ब्रेसिज़ आवश्यक नहीं हैं। ब्रेसेस मामलों का उपयोग करने से किसी केस के दायरे को लेकर भ्रम पैदा हो सकता है।

एक उद्घाटन ब्रेस आम तौर पर किसी फ़ंक्शन के प्रारंभ या लूप की शुरुआत या वर्ग घोषणा की शुरुआत या सरणी इनिशियलाइज़ेशन आदि की शुरुआत जैसे सार्थक से जुड़ा होता है ... हम जानते हैं कि, जब ब्रेक का सामना होता है, तो मामला स्विच ब्लॉक से बाहर हो जाता है। बयान। इस प्रकार घुंघराले ब्रेसिज़ का उपयोग करना एक अज्ञानी पाठक के लिए मामले में एक अलग दायरे का विचार करना है। तो, बेहतर प्रोग्रामिंग पठनीयता के लिए घुंघराले ब्रेसिज़ का उपयोग करने से बचना बेहतर है।

यानी जब मेरे पास कुछ है,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"हैलो 1 से" मुद्रित हो जाता है। लेकिन घुंघराले ब्रेस का उपयोग एक अज्ञानी पाठक को सुझाव दे सकता है कि मामला '}' के साथ समाप्त होता है, पहले से ही यह जानकर कि लूप, विधियों आदि के मामले में आमतौर पर घुंघराले ब्रेसिज़ क्या संकेत देते हैं।

जैसे हमारे पास 'C' में जंप-टू-लेबल स्टेटमेंट हैं, कंट्रोल सिर्फ केस में बदलता है और इसे जारी रखता है। तो, उस समझ के साथ स्विच के मामलों को लिखते समय घुंघराले ब्रेसिज़ का उपयोग करना केवल एक बीएडी अभ्यास है।

तकनीकी रूप से बोलते हुए आप अपने कोड के किसी भी ब्लॉक को मान्य सिंटैक्स के साथ उपयोग किए जाने पर अतिरिक्त ब्रेसिज़ के साथ घेर सकते हैं। स्विच में ब्रेसिज़ का उपयोग करना मेरे लिए कम से कम इतना बुरा लगता है क्योंकि यह एक अलग एहसास देता है जैसे मैंने ऊपर कहा है।

मेरा सुझाव: बस स्विच मामलों के लिए आसपास के ब्रेसिज़ का उपयोग करने से बचें।


5
इससे असहमत हैं। ब्रेसिज़ का उपयोग करना और ब्रेसिज़ के बाहर कोड लिखना बहुत बुरा रूप होगा, हाँ, लेकिन यह अपने आप में ब्रेसिज़ के उपयोग को बदनाम नहीं करता है।
मैक्स रॉनकस

12

ब्रेसिज़ के साथ।

बहुत सारी चीजें हैं जो स्विच स्टेटमेंट के साथ गलत हो सकती हैं मैं उन्हें बचने की कोशिश करता हूं जहां मैं कर सकता हूं, अर्थात

  1. टूटने को भूल जाना और इस प्रकार मामला गिरना
  2. एक डिफ़ॉल्ट मामले को भूल जाना और इस प्रकार शर्त के लिए एक अन-कैटरेड को नहीं पकड़ना
  3. केस स्टेटमेंट्स के बीच वैरिएबल का पुन: उपयोग करना, या इससे भी बदतर, एक वेरिएबल को प्रभावित करना जो केस स्टेटमेंट्स के बीच एक वैरिएबल को साझा करना है।

ब्रेसेस का उपयोग करना केस स्टेटमेंट के बीच चरों के जानबूझकर और आकस्मिक दोनों को साझा करने से रोकने का एक तरीका है


8
इस प्रश्न के लिए अंक 1 और 2 शामिल करना मेरे लिए भ्रामक था; आपकी क्लोजिंग लाइन को स्पष्ट रूप से कहना चाहिए कि ब्रेसिज़ केवल 3 को हल करता है - मुझे लगा कि आपका मतलब है कि ब्रेसिज़ ने ब्रेक की आवश्यकता को छोड़ दिया, फिर कोशिश की।
अताउल्म

बिंदु 3 का भी कोई मतलब नहीं है। जब तक कि वे स्विच स्टेटमेंट के एक पैरेंट स्कोप में घोषित नहीं किए जाते, आप वैरिएबल का पुन: उपयोग नहीं कर सकते। इसका मतलब है कि यदि आप किसी मामले में एक चर घोषित करते हैं, तो इसका उपयोग किसी अन्य मामले के बयान में नहीं किया जा सकता है। यदि आप स्विच स्टेटमेंट (पैरेंट स्कोप में) के ऊपर एक वैरिएबल घोषित करते हैं तो इससे कोई फर्क नहीं पड़ता कि आप ब्रेसेस का उपयोग करते हैं या नहीं, केस स्टेटमेंट्स में वैरिएबल का उपयोग होगा।
डिंगलटन

मैंने अभी (पुनः) पता लगाया कि केस 1 में घोषित चर अभी भी मामले में 2 के दायरे में हो सकते हैं। उदाहरण के लिए: ...case 1: int a = 10; break; case 2: int a = 11; break; ...संकलन नहीं करता है। (ओरेकल
जेडडीके

5

यह सवाल शायद "तर्कवादी" (संक्षिप्त युद्ध!) के रूप में बंद होने जा रहा है लेकिन क्या बिल्ली। मुझे वास्तव में मामलों के बाद ब्रेसिज़ पसंद हैं। मेरे लिए यह बदसूरत स्विच वाक्यविन्यास को बाकी भाषा निर्माणों की तरह अधिक बनाता है। (इस "मामले" में ब्रेसिज़ का उपयोग करने के लिए कोई जुर्माना नहीं है)


मुझे लगता है कि यह एक वस्तुनिष्ठ प्रश्न है ... मैं तर्कपूर्ण बात को वापस लेता हूं
एंडी व्हाइट

मैं इसे ब्रेसिज़ के बिना पसंद करता हूं ... मुझे लगता है ब्रेसिज़ बहुत सारे अनावश्यक शोर जोड़ते हैं।
cdmckay

हाँ, मेरी इच्छा है कि यह इस तरह से अधिक था: मामला (FOO) {x = x + 1} मामला (BAR) {y = y + 1}
एंडी व्हाइट

समझदार व्हाट्सएप == अच्छा। अनावश्यक ब्रेसिज़ == चूसना।
शोग

3
व्हाट्सएप == टैब्स एंड स्पेस का मिश्रण == चूसना (बस मैंने सोचा कि मैं मिश्रण में एक टैब बनाम स्पेस कमेंट को फेंक दूंगा)
एंडी व्हाइट

5

आप कहते हैं कि ब्रेसिज़ को छोड़ा जा सकता है क्योंकि कोई भी चर नाम पुन: उपयोग नहीं किया जा रहा है। चर नामों का पुन: उपयोग करके, मेरा मानना ​​है कि आप एक ही प्रकार के नए चर की घोषणा करते हैं।

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


3

मैं स्विच मामलों के लिए ब्रेसिज़ का उपयोग नहीं करेगा।

  • स्विच स्टेटमेंट बिना ब्रेसिज़ के पहले से ही बारोक दिखता है।

  • स्विच के मामले बहुत कम होने चाहिए। जब आपको चर घोषित करने की आवश्यकता होती है तो यह एक संकेत है कि आप इसे गलत कर रहे हैं।

अब कुछ विरासत सी कोड को बनाए रखने के लिए जो खेल 500 + लाइनों के मामलों को स्विच करते हैं ...


1

मैंने इसके बारे में पहले कभी नहीं सोचा था। मामले के खंड में ब्रेसिज़ की आवश्यकता कभी नहीं थी, इसलिए वास्तव में यह नहीं देख सकता कि आपको उनकी आवश्यकता क्यों होगी। व्यक्तिगत रूप से मैं "यह बनाए रखना आसान होगा" विचार के लिए नहीं जाता है, यह सिर्फ बकवास है, यह बनाए रखना आसान होगा यदि कोड समझ में आता है और प्रलेखित है।

कोई ब्रेसिज़ नहीं ... कम सिंटैक्स अधिक है


{और} चीजों को हालांकि बाहर खड़े करते हैं, जिससे पढ़ना आसान हो जाता है (IMO)।
टोफूबीर

हाँ। मैं एक विधि की कहानी साझा करने जा रहा था जिसे मुझे एक बार संशोधित करना था (कोड की एक पंक्ति को जोड़ने के लिए मुझे लगभग 4 घंटे लगे) लेकिन कोड पागल था (मुद्रित होने पर लगभग 10 पृष्ठ लंबा और 4 पृष्ठ चौड़ा था) तो यह नहीं है विशिष्ट मामला। लेकिन अगर यह {} का उपयोग होता तो इसे जोड़ने में एक मिनट लगता।
टोफूबीर

मुझे लगता है कि यहाँ बिंदु यह है कि अगर मूल प्रोग्रामर {} ब्लॉक में डालने के प्रयास में गया था, ताकि कोड अधिक पठनीय हो, तो वे वास्तव में परवाह कर सकते थे कि वे जहां 10 पेज का स्विच स्टेटमेंट लिखते हैं और कोड को बदल दिया है थोड़ा कम पागल
गारेथ डेविस

swtich एक सपना रहा होगा .. यह nested if / elses ... COBOL प्रोग्रामर्स द्वारा C ++ कोड में लिखा गया था ... मैंने उसके बाद लंबे समय तक नहीं छोड़ा।
टोफूबीर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.