2013-09-22 8 views
5

मेरे पास एक टैब नियंत्रण है जिसमें 3 टैब पेज हैं। इस टैब के नीचे एक ही रूप/दृश्य पर नियंत्रण, मेरे पास 3 छवि नियंत्रण हैं।मैं स्विच स्टेटमेंट को कैसे खत्म करूं?

टैब के चयनित इंडेक्स के आधार पर, मुझे नीचे 3 छवियों की अस्पष्टता बदलने की आवश्यकता है।

switch (Tab.SelectedIndex) 
{ 
    case 0: 
     img1.Opacity= 1; 
     img2.Opacity = 0.5; 
     img3.Opacity = 0.5; 
     break; 
    case 1: 
     img1.Opacity = 0.5; 
     img2.Opacity = 1; 
     img3.Opacity = 0.5; 
     break; 
    case 2: 
     img1.Opacity = 0.5; 
     img2.Opacity = 0.5; 
     img3.Opacity = 1; 
     break; 
} 

मैं इस स्विच का बयान कैसे निकालूँ:

फिलहाल मैं टैब नियंत्रण के SelectionChanged घटना में कुछ इस तरह की है? मैं किस डिजाइन पैटर्न का उपयोग यहां करूं?

+0

क्यों हटाने/स्विच की जगह? क्या काम नहीं कर रहा है –

+0

यह इकाई परीक्षण योग्य नहीं है। – NoobDeveloper

+2

हां यह है। घटना-संचालित आसपास की समस्या एक समस्या हो सकती है, लेकिन इसके लिए एक बड़ा फिक्स की आवश्यकता होती है। –

उत्तर

1

आप इंस्टास here के लिए समझाए गए राज्य डिज़ाइन पैटर्न का उपयोग कर सकते हैं। आप कुछ राज्यों को परिभाषित करेंगे और फिर शर्त से तय करेंगे कि इस समय उनका किसका उपयोग किया जाना चाहिए।

उदाहरण:

abstract class State 
{ 
    abstract vod Apply(Form context); 
} 

class StateOne : State 
{ 
    override void Apply(Form context) 
    { 
     img1.Opacity= 1; 
     img2.Opacity = 0.5; 
     img3.Opacity = 0.5; 
    } 
} 

तुम भी फैक्टरी विधि डिजाइन पैटर्न है कि जो राज्य उपयोग करने का निर्णय होगा के साथ संयोजित कर सकते हैं।

static class StateFactory 
{ 
    static State GetState(condition) 
    { 
     if(condition == something) 
      return new StateOne(); 
     else ... 
    } 
} 

यह आपके कोड से स्विच स्टेटमेंट नहीं हटाएगा, लेकिन कम से कम उचित जगह पर उचित जगह होगी।

उपयोग:

StateFactory.GetState(condition).Apply(this); 
+0

मुझे विचार मिल रहा है। हालांकि, क्या आप इसे थोड़ा और समझा सकते हैं? इसलिए चयन में टैबस्ट्रक्चर का चेंज किया गया, मुझे कैसे पता चलेगा कि मुझे किस राज्य वस्तु की आवश्यकता होगी? – NoobDeveloper

+1

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

+0

+1, लेकिन मैं राज्य को पकड़ने और पुनर्प्राप्त करने के लिए 'शब्दकोश ' का उपयोग करता हूं (उदा।, '_states [tab.SelectedIndex]। कृपया (यह)') – Will

1

मुझे लगता है कि आप Triggers का उपयोग करके अपने XAML अपने आप में इस संभाल कर सकते हैं।

इसके अलावा, अगर आप इस इकाई का परीक्षण किया जा करना चाहते हैं, तो आप MVVM pattern का उपयोग जहां आप अपने ViewModel में properties for SelectedIndex, Opacities को परिभाषित करने और उन्हें बाँध XAML को

+0

संपादित करें: यह वही है जो मैंने किया था। लेकिन जानबूझकर इसे मेरे प्रश्न में पोस्ट नहीं किया। मेरा सवाल अभी भी वही है। मैं फिर अपने वीएम का परीक्षण कैसे करूं? – NoobDeveloper

+2

यदि आप एमवीवीएम का उपयोग कर रहे हैं तो आप छवियों के opaciteis के लिए अपने ViewModel गुणों के लिए टेस्ट केस लिख सकते हैं, जब आप चयनित इंडेक्स संपत्ति बदलते हैं तो बदल दिया जाएगा – Nitin

0

आप मनमाने ढंग से डेटा का एक समूह है कि आप में पारित करने के लिए की जरूरत है, तो होगा चाहिए। .. फिर वास्तव में स्विच कथन आसानी से प्राप्त करने का कोई तरीका नहीं है (यह कम से कम प्रयास के लायक है)। मैं कम से कम कोड पठनीयता के मामले में, एक enum का उपयोग करने के लिए सुझाव देंगे। आप इस तरह अपना कोड दोबारा कर सकते हैं:

switch ((ImageTypes)Tab.SelectedIndex) 
    { 
     case ImageTypes.TypeOne: 
      img1.Opacity= 1; 
      img2.Opacity = 0.5; 
      img3.Opacity = 0.5; 
      break; 
     case ImageTypes.TypeTwo: 
      img1.Opacity = 0.5; 
      img2.Opacity = 1; 
      img3.Opacity = 0.5; 
      break; 
     case ImageTypes.TypeThree: 
      img1.Opacity = 0.5; 
      img2.Opacity = 0.5; 
      img3.Opacity = 1; 
      break; 
    } 
    public enum ImageTypes 
    { 
     TypeOne, 
     TypeTwo, 
     TypeThree 
    } 
1

निकालें और इंजेक्ट करें। बाहरी वर्ग/विधि के लिए दृश्य बदल रहा है तर्क (स्विच) निकालें और आपके विचार के लिए इसे इंजेक्षन:

private void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    this.highlighter.HighlightImages(Tab.SelectedIndex, img1, img2, img3); 
} 

इस तरह आप होना चाहिए:

public void HighlightImages(int selection, params Image[] images) 
{ 
    switch (selection) 
    { 
     case 0: 
      images[0].Opacity= 1; 
      images[1].Opacity = 0.5; 
      images[2].Opacity = 0.5; 
      break; 
     case 1: 
      images[0].Opacity = 0.5; 
      images[1].Opacity = 1; 
      images[2].Opacity = 0.5; 
      break; 
     case 2: 
      images[0].Opacity = 0.5; 
      images[1].Opacity = 0.5; 
      images[2].Opacity = 1; 
      break; 
    } 
} 

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

0

यह पूरी तरह से इसे हटा नहीं देगा, क्योंकि एक बड़ी कक्षा विरासत बनाने के अलावा अन्य कुछ नहीं किया जाना चाहिए, लेकिन यह इस स्थिति के लिए थोड़ा अधिक होगा।

इसके बजाय, आप इस तरह इसका आकार कम कर सकते हैं:

switch (Tab.SelectedIndex) 
{ 
    img1.Opacity = 0.5; 
    img2.Opacity = 0.5; 
    img3.Opacity = 0.5; 

    case 0: 
     img1.Opacity += 0.5; 
     break; 
    case 1: 
     img2.Opacity += 0.5; 
     break; 
    case 2: 
     img3.Opacity += 0.5; 
     break; 
} 

और तुम तरीकों के साथ कोड अतिरेक कम कर सकते हैं, तो आप 0.5 हर जगह हर बार जब आप अस्पष्टता को बदलना चाहते हैं बदलने के लिए नहीं है। (0 डाल रहा है।एक निरंतर में 5 भी अच्छा होगा):

switch (Tab.SelectedIndex) 
{ 
    SetInitialOpacity(img1); 
    SetInitialOpacity(img2); 
    SetInitialOpacity(img3); 

    case 0: 
     IncreaseOpacity(img1); 
     break; 
    case 1: 
     IncreaseOpacity(img2); 
     break; 
    case 2: 
     IncreaseOpacity(img3); 
     break; 
} 

private void SetInitialOpacity(Image image) 
{ 
    image.Opacity = 0.5; 
} 


private void IncreaseOpacity(Image image) 
{ 
    image.Opacity += 0.5; 
} 
0

का जिक्र करते हुए क्या "जिमी-उत्सुक" कहा, यह क्या मैं के लिए जाना होता है:

public static void HighlightImages(int selection, params Image[] images) 
    { 
     for (int img = 0; img < images.Length; img++) 
     { 
      images[img].Opacity = (img == selection ? 1 : 0.5); 
     } 
    } 
संबंधित मुद्दे