2013-04-10 6 views
14

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

EnumOne enumOne; 
EnumTwo enumTwo = null; 
EnumTwo enumThree = null; 

switch (enumOne) { 
    case CASE_ONE: 

     switch (enumTwo){ 
     case A: enumTwo = EnumTwo.B; break; 
     case C: enumTwo = EnumTwo.D; break; 
     default: break; 
     } 

     switch (enumThree) { 
     case AA: enumThree = EnumTwo.BB; break; 
     case CC: enumThree = EnumTwo.DD; break; 
     default: break; 
     } 

     break; 

    case CASE_TWO: 
    case CASE_THREE: 

     switch(EnumTwo) { 
     default: break; 
     } 

     switch (enumThree) { 
     case AA: enumThree = EnumTwo.XX; break; 
     case CC: enumThree = EnumTwo.YY; break; 
     default: break; 
     } 

     break; 

    default: 
     break; 
} 

तो मेरे सवाल हो, अनिवार्य रूप से, क्या इन बयानों स्विच करने के लिए एक उपयुक्त विकल्प होगा होगा: यहाँ क्या मेरी कोड की तरह दिखाई देता का एक नमूना है?

+1

इसके लिए आप इसका क्या उपयोग कर रहे हैं? एक राज्य मशीन मॉडल करने के लिए? – flup

+2

तो enumTwo अपने मूल्य को enum के एक, दो और तीन के मूल्य पर निर्भर करता है? EnumTwo में कोई तरीका क्यों नहीं है जो नया मान देता है? एक राज्य पैटर्न के समान। –

+0

घोंसले स्विच/यदि कथन के बहुत सारे उपयोग आमतौर पर डिज़ाइन त्रुटियों को दिखाते हैं, विशेष रूप से यदि आप ओओ भाषाओं में ऐसा कर रहे हैं, तो आपको उन पर उपलब्ध सुविधाओं का उपयोग करना चाहिए। – gersonZaragocin

उत्तर

14

मैं आपको प्रत्येक नेस्टेड स्विच स्टेटमेंट को उस प्रक्रिया में कॉल के साथ प्रतिस्थापित करने की सलाह देता हूं जो तब नेस्टेड स्विच कोड निष्पादित करता है।

इस बजाय की तरह कुछ लिखें:

EnumOne enumOne; 
    EnumTwo enumTwo = null; 
    EnumTwo enumThree = null; 

    switch (enumOne) 
    { 
     case CASE_ONE: 

      nested_switch1(); 

     case CASE_TWO: 
     case CASE_THREE: 

      nested_switch2(); 

      break; 

     default: 
      break; 
    } 

    nested_switch1() { 
      switch (enumTwo) 
      { 
      case A: 
       enumTwo = EnumTwo.B; 
       break; 
      case C: 
       enumTwo = EnumTwo.D; 
       break; 
      default: 
       break; 
      } 

      switch (enumThree) 
      { 
      case AA: 
       enumTwo = EnumTwo.BB; 
       break; 
      case CC: 
       enumTwo = EnumTwo.DD; 
       break; 
      default: 
       break; 
      } 

      break; 
    } 

nested_switch2() { 
      switch(EnumTwo) 
      { 
      default: 
       break; 
      } 

      switch (enumThree) 
      { 
      case AA: 
       enumTwo = EnumTwo.XX; 
       break; 
      case CC: 
       enumTwo = EnumTwo.YY; 
       break; 
      default: 
       break; 
      } 
} 
+0

एक मूल ओओपी सिद्धांत। – klutch

20
  1. स्विच का एक बहुत का उपयोग कर के रूप में बहुत पढ़ने के लिए मुश्किल हो जाता है।
  2. और किसी भी समय एक नया मामला तब पैदा होती है हम हम इस तरह के मामलों

    में polymorphism का उपयोग कर मैं बस आपको यह बताने के लिए एक सरल वर्ग देने जा रहा हूँ पर विचार कर सकते

कोड को संशोधित करने और एक मामले में जोड़ने के लिए समझना। स्विच मामले से पहले एक वर्ग मान लीजिए

class Test 
{ 
    Animal a; 
    public Test(Animal a) 
    { 
     this.a=a; 
    } 

    public moveThisAnimal() 
    { 
     switch(this.a) 
     { 
      case fish: 
      System.out.println("swim"); 
      break; 

      case dog: 
      System.out.println("walk"); 
      break; 

      case bird: 
      System.out.println("fly"); 
      break; 
     } 
    } 
} 

अब हम की जगह ये हमारे बहुरूपता तर्क के साथ स्विच

Interface Animal 
{ 
    String move(); 
} 

Class Dog implements Animal 
{ 
    public String move() 
    { 
     return "walk"; 
    } 
} 


Class Bird implements Animal 
{ 
    public String move() 
    { 
     return "fly"; 
    } 
} 


Class Fish implements Animal 
{ 
    public String move() 
    { 
     return "swim"; 
    } 
} 

अब हम स्विच मामले के बिना टेस्ट वर्ग है

class Test 
{ 
    Animal a; 
    public Test(Animal a) 
    { 
     this.a=a; 
    } 
    public moveThisAnimal() 
    { 
     System.out.println(this.a.move()); // all switch case statements removed 
    } 
} 

और यहां तक ​​कि हम अगर आगे के मामलों को जोड़ना है, हमें केवल कार्यान्वयन को जोड़ना है, कोई बदलाव नहीं

अपना पूरा कोड देखें और देखें कि

+0

यह एक बहुत उपयोगी उत्तर था, सिवाय इसके कि मुझे प्रस्तुत किए गए कुछ मुद्दों को मिला। "कक्षा" कम मामला होना चाहिए, साथ ही साथ प्रत्येक पशु के लिए कदम को ओवरराइड करना चाहिए। इसके अलावा, पहला उदाहरण उन्हें System.out.println के रूप में प्रदर्शित करता है, लेकिन इसे "सही" तरीके से प्रस्तुत नहीं किया जाता है। मैं इसे इस तरह से किया सार्वजनिक शून्य moveThisAnimal() { println (this.a।ले जाने के()); // सभी स्विच केस स्टेटमेंट } सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) { कुत्ता डी = नया कुत्ता(); परीक्षण टी = नया परीक्षण (डी); t.moveThisAnimal(); } – XaolingBao

4

यदि आपके पास एक्स और वाई पूर्णांक हैं और आपको दोनों को स्विच करने की आवश्यकता है, तो आप उन्हें कुछ स्पष्ट तरीके से संयोजित कर सकते हैं और संयोजन पर स्विच कर सकते हैं। उदाहरण के लिए, यदि y < 10:

switch (x*10+y) 
{ 
case 0: // x == y == 0 
case 1: // x ==0, y == 1 
/// 
case 10: // x == 1, y == 0 
case 11: // x == y == 1 
// 
} 
+0

ऐसा करने का यह सबसे आसान और सबसे अच्छा तरीका है। – Napolean

+1

यह मानता है कि आदेश महत्वपूर्ण नहीं है। एक्स * 10 + y = y * 10 + x। इससे झूठी सकारात्मक –

+1

@inkalimeva * उदाहरण * उस धारणा को जन्म दे सकता है। सामान्य तकनीक नहीं है। – EJP

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