2013-08-22 5 views
5

क्या स्विच केस में स्विच केस होने का बुरा अभ्यास है? यदि हां, तो विकल्प क्या हैं? यदि मुझे आवश्यकता नहीं है तो मैं वास्तव में if/else if का उपयोग नहीं करना चाहता हूं।क्या स्विच केस में स्विच केस होने का बुरा अभ्यास है?

इसके बजाय कुछ की तरह करने का

:

if((this == 1) && (that == 1)){ //something } 
else if((this == 1) && (that == 2)){ //something } 
else if((this == 2) && (that == 3)){ //something } 

मैं की तर्ज पर सोच रहा था:

switch(this){ 
    case 1: 
     switch(that){ 
      case 1: 
       // something 
      break; 
      .... 
     } 
    break; 
    .... 
} 

यह सिर्फ वास्तव में मेरे लिए गलत लग रहा है। वाक्यविन्यास में गलत नहीं है लेकिन उचित अभ्यास के मामले में गलत है।

+2

मैं ऐसे मामलों को देख सकता हूं जहां यह ठीक है। लेकिन मैं इसे बहुत लंबे समय तक देखता हूं और देखता हूं कि मुझे एक सरल तकनीक मिल सकती है या नहीं। –

+0

वास्तव में एक डुप्ली नहीं है, लेकिन इसमें प्रासंगिक/रोचक जानकारी है: http://stackoverflow.com/questions/7807970/nesting-switch-cases-in-javascript-any-speed-advantage – Joum

+1

प्रासंगिक उत्तरों प्राप्त करने के लिए यह बेहतर होगा प्रश्न में अपना कोड जोड़ें ... –

उत्तर

3

बचें निम्नलिखित दृष्टिकोण

switch(id) 
{ 
    case 1: 
    { 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
    } 
    case 2: 
     // some code 
} 

बेहतर दृष्टिकोण और एक विधि

switch(id) 
{ 
    case 1: 
     SubSwtich(subid); 
     break; 
    case 2: 
     // some code 
} 

function SubSwtich(int subid) 
{ 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
} 
+0

सभी बेहतरीन उत्तरों के लिए धन्यवाद। मैं सभी अंतर्दृष्टि की सराहना करता हूं। – seroth

3

मैं इसे एक बुरा प्रेटिस मानता हूं। ज्यादातर मामलों में यह अपठनीय है।

आप "सब" स्विच-केस विधियों को निकाल सकते हैं।

7

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

लेकिन कोई कठोर और तेज़ नियम नहीं हैं; यह सब सटीक परिदृश्य पर निर्भर करता है।

0

खराब अभ्यास? नहीं! जब समस्या निवारण की बात आती है तो संभावित दर्द! देखें कि आप सभी 'विकल्प' को और अधिक संगठित और सामान्य रूप से कनेक्ट करने के बारे में क्या कर सकते हैं। हो सकता है कि भेजे जा रहे पैरामीटर की संख्या द्वारा निर्धारित विधि ओवरलोडिंग का उपयोग करके अपना स्वयं का फ़ंक्शन भी लिखें।

at this SO post पर एक नज़र डालें और देखें कि यह आपको कुछ विचार देता है या नहीं।

0

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

private void Switch(int value) 
    { 

     switch (value) 
     { 
      case 1: 
       SwitchNest(value); 
       break; 
      case 2: 
       break; 
     } 
    } 

    private void SwitchNest(int value) 
    { 
     switch (value) 
     { 
      case 1: 
       SwitchOtherMethod(value); 
       break; 
      case 2: 
       break; 
     } 
    } 
+0

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

1

में नेस्टेड अनुभाग चलती इसे अपने कोड कठिन पढ़ने के लिए बनाता है के द्वारा अपने कोड में सुधार, तो यह बुरा है अभ्यास।

चाहे आपके विशेष उदाहरण में यह मामला तय करने के लिए है, लेकिन आम तौर पर मैं कहूंगा कि यह शायद मामला होगा।

आप विकल्प के लिए कहा ...

  1. एक उप-समारोह में अपने कोड के कुछ निकालें। उदाहरण के लिए:

    case 'foo' : 
        myVar = 'blah'; 
        break; 
    case 'bar' : 
        myVar = secondLevelFunction(); 
        break; 
    

    यहाँ, secondLevelFunction() अतिरिक्त switch() बयान जहां प्रत्येक casemyVar के लिए एक मान देता है शामिल हैं।

  2. सरणी मैपिंग का उपयोग करें।उदाहरण के लिए:

    var mapper = {'foo':'blah', 'bar':'bibble', etc}; 
    
    //now, instead of a big switch(input) { .... } block that sets myVar 
    //for each option, you can just set it directly in a single line, like so: 
    var myVar = mapper[input]; 
    

इसके अलावा, आप कोड की गुणवत्ता के ठोस कदम के लिए देख रहे हैं, तो आप Cyclomatic Complexity के बारे में सीखना चाहिए। यह एक उपाय है कि एक समारोह कितना जटिल है। इस समारोह को देखकर माप लिया जाता है कि फ़ंक्शन के कितने "निर्णय बिंदु" हैं। प्रत्येक case, if, लूप, आदि एक "निर्णय बिंदु" है। आपके पास जितना अधिक होगा, उतना ही जटिल होगा।

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

स्पष्ट रूप से वैकल्पिक समाधानों को आपकी आवश्यकताओं के अनुरूप अनुकूलित करने की आवश्यकता होगी, लेकिन उम्मीद है कि वे आपको कुछ विचार देंगे।

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