2009-03-11 17 views
70

निम्नलिखित दो स्निपेट पर विचार करें, जो कोष्ठकों:जावा स्विच के मामले: ब्रेसिज़ के साथ या बिना?

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; 
} 

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

उत्तर

78

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

कोई नहीं।

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

5

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

+0

मुझे लगता है कि यह एक तरह का एक उद्देश्य प्रश्न है ... मैं तर्कसंगत चीज को वापस लेता हूं –

+0

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

+0

हाँ, मेरी इच्छा है कि यह इस तरह अधिक था: केस (भोजन) {x = x + 1} केस (बीएआर) {y = y + 1} –

5

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

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

21

यह चरम समयपूर्व अनुकूलन का उदाहरण है। चिंता करना और डीबग करना आसान तरीका है, इस बारे में चिंता करना एक बेहतर विचार होगा।

+82

या ... शायद मैं सिर्फ उत्सुक था? – cdmckay

+14

सहमत हुए। यह जानने का एकमात्र तरीका है कि ऑप्टिमाइज़ेशन समय से पहले हो सकता है या नहीं, इन प्रकार के प्रश्न पूछना है। –

+13

येर, आप पर खुदाई करने के लिए नहीं था।लेकिन, मैं हमेशा खुद को याद दिलाने की कोशिश करता हूं कि पठनीयता कोड का सबसे महत्वपूर्ण पहलू है। दर्द के लिए – Travis

16

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

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

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

+2

+1 – Travis

+0

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

+0

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

8

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

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

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

ब्रेसिज़ का उपयोग करते हुए एक तरह से मामले बयान

+6

अंक 1 और 2 सहित इस प्रश्न के लिए भ्रामक था (मेरे लिए); आपकी समापन रेखा स्पष्ट रूप से कहनी चाहिए कि ब्रेसिज़ केवल 3 हल करता है - मैंने सोचा था कि आप का मतलब है कि ब्रेसिज़ ने ब्रेक की आवश्यकता को रोक दिया, फिर कोशिश की। – ataulm

+0

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

1

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

नहीं धनुकोष्ठक ... कम वाक्य रचना स्विच मामलों के लिए और अधिक

+0

{और} चीजों को भी खड़ा कर देता है, जो इसे पढ़ने में आसान बनाता है (आईएमओ)। – TofuBeer

+1

हर किसी के पास राय है –

+0

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

3

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

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

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

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

12

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

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

अर्थात जब मैं की तरह कुछ,

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

    case 2: 
    .... 
} 

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

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

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

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

+0

इसके साथ असहमत। ब्रेसिज़ का उपयोग करके ब्रेसिज़ के बाहर कोड लिखना बहुत बुरा फॉर्म होगा, हां, लेकिन यह ब्रेसिज़ के उपयोग को खुद ही बदनाम नहीं करता है। – caseif

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