2013-09-22 10 views
5

私は3つのタブページを持つタブコントロールを持っています。同じフォーム/ビューのこのタブコントロールの下に、私は3つの画像コントロールを持っています。Switchステートメントを削除するにはどうすればいいですか?

タブのSelectedIndexに基づいて、以下の3つの画像の不透明度を変更する必要があります。

今のように私は、タブコントロールのSelectionChangedイベントでこのようなものを持っている:

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

どのように私はこのswitch文を削除しますか?ここではどのデザインパターンを使用しますか?

+0

なぜ削除/スイッチを交換しますか?何が効いていないのですか? –

+0

ユニットテスト可能ではありません。 – NoobDeveloper

+2

はい、そうです。イベント駆動型の環境は問題になるかもしれませんが、それはより大きな修正を必要とします。 –

答えて

1

instace 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 ... 
    } 
} 

これでコードからswitch文は削除されませんが、合理的なことを行うには少なくとも合理的な場所にあります。

使用法:

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

私は考えを得ています。しかし、もう少し説明できますか?ですから、TabcontrolのSelectionChangedでは、どのStateオブジェクトが必要なのでしょうか? – NoobDeveloper

+1

@Nexus ifステートメントやswtichステートメントを削除することはできますが、新しいステートを追加する必要があるときに、頻繁に表示されない場所に配置することができます。あなたのためにFactoryメソッドでコードを更新しました。 –

+0

+1ですが、 '_states [tab.SelectedIndex] .Apply(this)'などの状態を保持して取得するには 'Dictionary 'を使用します。 – Will

1

私はあなたがTriggersを使用して、XAML自体でこれを扱うことができると思います。あなたはこのユニットがテスト可能にしたい場合は、あなたのViewModelproperties for SelectedIndex, Opacitiesを定義し、あなたがに渡す必要がある任意のデータの束を持っている場合

+0

編集:それはまさに私がやったことです。しかし、意図的に私の質問にそれを投稿していません。私の質問はまだ同じです。私はどのように私のVMをテストするのだろうか? – NoobDeveloper

+2

MVVMを使用している場合は、selectedindexプロパティを変更したときに変更される画像の不透明度に対するViewModelのプロパティのテストケースを記述できます – Nitin

0

をXAMLするためにそれらを結合する場所

また、あなたはMVVM patternを使用する必要があります。 ..本当にswitch文を簡単に回避する方法はありません(少なくとも、努力する価値があります)。少なくともコードの可読性の観点から、列挙型を使用することをお勧めします。あなたはこのようなあなたのコードをリファクタリングできます

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); 
     } 
    } 
関連する問題