2016-07-27 5 views
2

私は電子メールニュースレターの作成とテストに使用したWinFormを持っています。このフォームには、さまざまなメソッドとイベントが含まれています。Winformの機能を処理する2つの異なる方法に対応するデザインパターン

私はプログラムにスプリットテスト(A/Xテスト)を許可し、キャンペーン用に最大4つの異なるニュースレターを作成するための新しい機能を追加します。

したがって、通常のニュースレターとA/Xニュースレターの両方に対応するようにフォームを拡張したいと考えています。私は私のフォームに2つの異なるモードを追加するつもりです。次のようなものがあります:

private enum CampaignMode { Normal, AxTest }; 

多くのコントロールの視認性が変わることを除いて、外観は非常に似ています。

とは別に、ほとんどすべてのメソッドとイベントには、2つの処理方法があります。

別の新しいフォームを作成する必要がないように、どのデザインパターンを使用する必要がありますか?

  1. コンストラクタ:簡単にするために

    は、のは、私のフォームは、次のメソッドを持っているとしましょう、おそらくパラメータとしてEditModeを受け

  2. ロード
  3. を作成します。ボタンのクリックイベントを
  4. SetControlViews:Based Normalモード
  5. MethodBに固有:EditMode上のコントロールの可視性
  6. MethodA設定AxTestモード
+0

あなたはMVPのようなものを考えましたか?フォームはビューインタフェースに抽象化され、次に2つの実装(プレゼンター?)があります。 –

+0

@DavidOsborne問題は、この形式は大きなプログラムのほんの一部に過ぎません。最初に 'MVP'を適用するのはいいでしょう。しかし、私は、プログラムの完全な見直しをしなければ、フレームワークを部分的に適用することは私には何の役にも立たないでしょう。 – Disasterkid

+2

必ずしもそうではありません。 IViewコンセプトを採用し、2つのプラグイン可能な実装を持つことができます。きちんとしたSOLIDソリューションを作成するために厳密にMVPである必要はありません。 –

答えて

1

私は単に、各メソッド/イベントに対して2つの関数を用意し、CampaignModeの値に応じてメインハンドラに適切な関数を呼び出させるだけです。

public enum CampaignMode { Normal, AxTest }; 
public partial class DemoForm : Form 
{ 
    private CampaignMode campaignMode; 
    public DemoForm(CampaignMode mode) 
    { 
     InitializeComponent(); 
     campaignMode = mode; 
     SetControlsVisibility(); 
    } 
    private void SetControlsVisibility() 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      //Set normal controls visible; 
      //Set axtest controls invisible; 
     } 
     else 
     { 
      //Set normal controls invisible; 
      //Set axtest controls visible; 
     } 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      MethodA();     
     } 
     else 
     { 
      MethodB(); 
     } 
    } 
    private void MethodA() 
    { 
    } 
    private void MethodB() 
    { 
    } 
} 

注:多くのコントロールがある場合、ブールパラメータで可視性機能を持つように滑らかな印象です。例えば

private void SetNormalVisibility(bool isNormal) 
    { 
     //normalTextBox.Visible = isNormal; 
     //normalButton.Visible = isNormal; 
     //axTestTextBox.Visible = !isNormal; 
     //axTestButton.Visible = !isNormal; 
    } 

にSetControlsVisibility機能を変化する場合:

private void SetControlsVisibility() 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      SetNormalVisibility(true); 
     } 
     else 
     { 
      SetNormalVisibility(false); 
     } 
    } 

HTH

ジョナサン

+0

これは結局私がやることだと思います。 – Disasterkid

+0

'CampaignMode'を追加するとどうなりますか? –

+1

@Disasterkidあなたは基本的に 'if/else'と闘っていました!皆さんの質問を読んでいる皆さんは、本当の柔軟なデザインが必要だと思いました。私は十分に柔軟なif/elseものとは呼んでいない。それは固体ではない。インタフェースはより良いアプローチです。 – niksofteng

2

に固有のTemplate Methodは良い候補になるような音。

は、基本的な初期化のためのロジックの世話をする、基本クラス、Load()Create()SetControlViews()を行い、その後、専門的なロジックに従って2つの派生クラスでMethod()は、仮想およびオーバーライドします。また、各派生クラスのコンストラクタは、特殊な初期化を行うことができます。

この方法では、CampaignMode列挙型(同じものを意味する場合はEditMode)も必要ありません。異なるエンティティの存在は、異なる派生クラスの存在によって説明される。

関連する問題