2009-07-21 16 views
2

ここのオブジェクトは、UIを更新することです。私は通常クライアントでこれを行いますが、このアプリケーションではコードを使用しています。とにかく私の質問は、これらのifステートメントをクリーンアップしようとしていると私は戦略パターンが適切かもしれないと思ったです。私はすべてのことを私のためにする必要はありませんが、もしあなたが私に行くためのカップルのポインタを与えることができます。最初にインターフェースを作成してから、各戦略でインターフェースを実装しますか?ジェネリックはここで役に立つの?インターフェイスにはどのようなメソッドが必要ですか?私を連れて行くために何かが非常に感謝されるでしょう。リファクタリングヘルプ - 戦略パターン

if (someObject.Status == 'A') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
       } else if (someObject.Status == 'D') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "- De-archive Request Pending"; 
       } else { 
        btnRecordCall.Enabled = true; 
        btnAddMailOrStatusAction.Enabled = true; 
        btnPayments.Enabled = true; 
        btnAddressMaint.Enabled = true; 
        btnFilter.Enabled = true; 
        btnAddCoverage.Enabled = true; 
        btnPolicyForms.Enabled = true; 
        lblIsArchived.Text = ""; 
       } 

おかげで、すべての〜CK

答えて

3

まあまず、あなたは、このようなインターフェイスをお勧めしますインターフェイスとStrategyパターンを使用するつもりなら。その後、

public interface IStrategyUI 
{ 
    void Execute(); 
} 

あなたのロジックのためのいくつかのクラス

public class StatusAStrategy : IStrategyUI 
{ 
    public void Execute() 
    { 
     //implement 
    } 
} 

、あなたのif文は、技術的には、工場することができます。

IStrategyUI logic; 

switch(someObject.Status) 
{ 
    case 'A': logic = new StatusAStrategy(); 
      //etc etc 

} 

logic.Execute(); 

このオブジェクトをインターフェイスとして返し、switch文を別のメソッドまたはファクトリクラスにカプセル化することができます。

このように使用することができます。

IStrategyUI logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 

これはあなた次第です。

また、私はここで封じ込めクラスを使用していませんが、あなたはできます。

また、代理人でこれを行うこともできます。

コンテクラス

class StrategyHolder 
    { 
     public Action Strategy { get; set; } 

     public void Execute() 
     { 
      if(this.Strategy != null) 
       this.Strategy(); 
     } 
    } 

異なる戦略の方法。

void EnableStatusA() 
{ 
    //do everything for status A 
} 

Switchステートメント

StrategyHolder logic = new StrategyHolder(); 

switch(someObject.Status) 
    { 
     case 'A': logic.Strategy = EnableStatusA; 
       //etc etc 

    } 

return logic; 

が外からこれを呼び出します。

StrategyHolder logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 
+0

ありがとうスタン。実装のexecuteメソッドでは、どのようにページコントロールへの参照を取得しますか?私はページへの参照を渡し、findcontrol( 'someId')をしますか?それとも良い方法がありますか? – Hcabnettek

+0

はい、ページ自体に参照を渡してから、前と同じことを行うことができます。つまり、page.lblIsArchived.Text = "";ページへの参照をコンストラクタまたはExecuteメソッドで渡すことができます。それはあなた次第です。 –

3

すべてのボタンは、ステータスに関係なく有効に同じを取得した場合、あなたの例のように、私はボタンのリストにそれを離れて非表示にしたいとちょうどそれらを反復処理します。その後、戦略のパラメータは単一のブール値と文字列になってしまいます。それを行うのはかなり簡単です。複雑さが増すと、コントロールを設定するインターフェイスを実装する異なるクラスが順番になり、おそらく全体のロジックを保持する抽象スーパークラスになります。

+0

カールありがとう。 – Hcabnettek

0

あなたが探しているものはState pattenです。これは戦略パターンと似ていますが、各状態オブジェクトは通常、コンテキストオブジェクト(この場合はフォームです)への参照が作成されるときに与えられます。これにより、様々な状態が、イベントに応答してコンテキストオブジェクトに対して何かを行うことが可能になる。

状態パターンを実装すると、それぞれの独立した状態を抽象基本クラスから継承させることが望ましい場合がよくあります。基本クラスは、仮想メソッドで既定の操作を実装することができ、各状態ごとに異なる操作をオーバーライドするだけで済みます。

public interface IFormState 
{ 
    void EnableDisableControls(); 
} 

public class DefaultState : IFormState 
{ 
    private MyForm context; 

    public DefaultState(MyForm context) 
    { 
     this.context = context; 
    } 

    protected MyForm Context 
    { 
     get 
     { 
      return this.context; 
     } 
    } 

    public virtual void EnableDisableControls() 
    { 
     this.context.btnRecordCall.Enabled = true; 
     this.context.btnAddMailOrStatusAction.Enabled = true; 
     this.context.btnPayments.Enabled = true; 
     this.context.btnAddressMaint.Enabled = true; 
     this.context.btnFilter.Enabled = true; 
     this.context.btnAddCoverage.Enabled = true; 
     this.context.btnPolicyForms.Enabled = true; 
     this.context.lblIsArchived.Text = ""; 
    } 
} 

public class StateA : DefaultState 
{ 
    public StateA(MyForm context) 
     : base(context) 
    { 
    } 

    public override void EnableDisableControls() 
    { 
     base.EnableDisableControls(); 

     this.Context.lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
     // etc... 
    } 
}