2010-04-07 9 views
5

मेरे पास एक लंबा स्विच-केस स्टेटमेंट है। कुछ मामलों में वास्तव में छोटे और तुच्छ हैं। कुछ लंबे समय तक इस तरह कर रहे हैं और कुछ चर कि कहीं और इस्तेमाल कभी नहीं कर रहे हैं की जरूरत है,:क्या स्विच स्टेटमेंट के मामले में स्थानीय ब्लॉक में एक चर को परिभाषित करना एक अच्छा विचार है?

int specialVariable = 5; 
switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: 
     // Do something complex with specialVariable 
     break; 
} 

यह कर सकते हैं:

switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: { 
     int specialVariable = 5; 
     // Do something complex with specialVariable 
     } break; 
} 

विकल्प switch इस तरह में जाने से पहले उस चर घोषित करने के लिए किया जाएगा बल्कि भ्रमित हो जाएं क्योंकि यह स्पष्ट नहीं है कि case वेरिएबल संबंधित है और यह कुछ अनावश्यक स्मृति का उपयोग करता है।

हालांकि, मैं इस प्रयोग कहीं और कभी नहीं देखा है।
क्या आपको लगता है कि एक ब्लॉक में स्थानीय रूप से एक case के लिए चर घोषित करना एक अच्छा विचार है?

उत्तर

11

यदि स्विच ब्लॉक के बाद विशेष उपलब्ध नहीं है, तो इसे "केस" ब्लॉक में घोषित करें।

सामान्य रूप से, चर के संभावित संभव दायरे में चर घोषित किया जाना चाहिए।

+0

क्या प्रत्येक मामले का दायरा है? मैं पूछता हूं क्योंकि एक केस के बिना स्विच के कोई मतलब नहीं है, निश्चित रूप से? – gbn

+4

@gbn - स्वयं ही, एक 'केस' एक नया दायरा नहीं बनाता है।कोड को नए दायरे को पेश करने के लिए '{}' जोड़ने की आवश्यकता होगी (जैसा कि ओपी अपने पहले उदाहरण में करता है)। –

+0

हां, यदि आप मामले (पन) में चर का उपयोग करने का इरादा रखते हैं तो आपको "स्कोप" बनाना होगा जहां चर केवल उस मामले में उपयोग किया जाएगा। – Max

3

हाँ संकीर्ण दायरे की जरूरत पर चर निर्धारित।

इसलिए उदाहरण 1 पसंद किया जाता है। संभव के रूप में छोटी संभव गुंजाइश -

1

मैक्स के साथ सहमत हूँ। इस तरह, जब अगले व्यक्ति को इसे अपडेट करने की आवश्यकता होती है, तो उसे स्विच स्टेटमेंट के अन्य अनुभागों में चर का उपयोग करने के बारे में चिंता करने की आवश्यकता नहीं है।

3

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

एक और लाभ यह है कि आप प्रत्येक case फ़ंक्शन को अलग अनुवाद इकाई पर डाल सकते हैं। यह केवल case एस को संकलित करके बिल्ड प्रक्रिया को तेज करेगा। अपने छोटे से दायरे में परिवर्तन अलग करके गुणवत्ता में सुधार भी करता है।

1

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

तो एक समारोह कहते हैं, और वहाँ में चर डाला!

2

मैं के लिए

case X: 
    { 
     type var; 
     ...; 
    } 
    break; // I like to keep breaks outside of the blocks if I can 

सब कर रहा हूँ वहाँ में सामान भी जटिल हो जाता है और एक स्विच/मामले के रूप में पूरे स्विच/मामले को देखने के लिए तो के रूप में ज्यादा ले जाने पर विचार के लिए अपनी क्षमता के रास्ते में आ शुरू होता है क्योंकि आप एक या दो इनलाइन फ़ंक्शंस में जा सकते हैं जिन्हें केस कोड द्वारा बुलाया जाता है। यह वहां पर फ़ंक्शन कॉल ओवरहेड फेंकने के बिना पठनीयता में सुधार कर सकता है।

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