5

3 つのタブ ページを持つタブ コントロールがあります。同じフォーム/ビューのこのタブ コントロールの下に、3 つのイメージ コントロールがあります。

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

今のところ、Tab コントロールの 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 ステートメントを削除するにはどうすればよいですか? ここでどのデザインパターンを使用しますか?

4

6 に答える 6

1

抽出して注入します。ビューを変更するロジック (スイッチ) を外部クラス/メソッドに抽出し、それをビューに挿入します。

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

選択変更ハンドラーでは、処理を注入された依存関係に委任するだけです。

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

このようにして、本格的なビュー コントロールをインスタンス化する必要なく、不透明度を変更するロジックを簡単にテストできるはずです。

于 2013-09-22T18:05:59.583 に答える
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;
}
于 2013-09-22T18:12:41.063 に答える
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);
        }
    }
于 2013-09-22T19:56:28.293 に答える