2009-07-13 10 views
2

私はDelphi 2009で軽量mvpフレームワークを実装しています。MVP:ビューとモデル以外のコンストラクタのパラメータ?

ビューはパッシブですが、(インターフェイスプロパティを介して)データバインディングをサポートしています。

私はジレンマに直面している: 私はいくつかの非常によく似たビュー/プレゼンター/モデルトライアド、すなわちをしました:

注文フォームと顧客フォーム=動作とロジックは同じですが、データバインディングのためのデータソースがあります異なるとフォームのタイトルも。データソースは私のすべてのモデルにとって共通のプロパティなので、フォームのタイトルを設定するには問題はありません。私はプレゼンターでハードコードしますInitViewメソッド

すべてがうまくいきますが、私がいくつかの単純なmvpトライアドを非常に似ている状況。私はそれをリファクタリングしたいが、その場合、いくつかのパラメータをmvpコンストラクタに渡さなければならない。

これまでのところ私はそのようにやっている:

  1. はプレゼンターを作成し、実際にはコンストラクタで

をモデルとビューを注入モデル

  • を作成ビュー
  • を作成します。

    1. 持つ:、私は選択肢に直面していますいくつかの非常に汎用ビュー/プレゼンターは、そのようにそれらを使用しますが、コンストラクタ
    2. いくつかのビュー/プレゼンターのスーパークラスを持つに1つのまたは2のパラメータを注入し、そこからすべての私の同様の図/プレゼンターを導出し、メソッドのオーバーライドには、いくつかの特定の値を設定します。

    あなたは私にいくつかのヒント/アドバイスを与えることができますか?

    (私は非常に明確ではないよ場合は申し訳ありません)

  • 答えて

    1

    フレッド、

    私は、一般的な振る舞いが含まれている抽象ビュー/プレゼンターを持って、その抽象的な機能を作成している方法で、1 & 2を選択しますサブクラスによって実装された特定のビヘイビアが可能である可能性があります。例えば

    public abstract class AbstractPresenter{ 
         // subclass will be implemented 
         public abstract void InitView(Model model, View view); 
        } 
    

    、その後、あなたはsublcassesを持っているかもしれませんが、OrderFormPresenterとCustomerFormPresneterがAbstractPresenterから延びています。

    public OrderFormPresenter extends AbstractPresenter{ 
        public void InitView(Model model, View, view){ 
         // do something specific values 
        } 
    } 
    
    public CustomerFormPresenter extends AbstractPresenter{ 
        public void InitView(Model model, View, view){ 
         // do something specific values 
        } 
    } 
    

    方向が間違っていれば修正してください。 私はそれが助けてくれることを願っています。

    タイガー

    +0

    タイガー、あなたの答えに感謝します。あなたの解決策は私の2番目のようです。私はそれがそれを行うためのきれいな方法であることに同意しますが、フォームのタイトルやラベルをフォームに設定するためにいくつかのサブクラスを作成することは、私が今見ているものから少し残念です。ご協力いただきありがとうございます。 – Fred

    1

    私は必要なパラメータのみとサブクラスを持つ汎用ビュー/プレゼンターを作成すると思います。

    1

    もう1つのアプローチ(そしてこの問題を解決したので、非常にうまく機能しました)は、モデルに汎用の「メタデータ」インターフェイスを構築し、ビュー(インターフェイスまたはクラス継承)あなたのプレゼンターの汎用インターフェース。私は自分のモデルに継承を使用することを選択しました。私のビューのインターフェイスは、既存のフォームでインターフェイスを叩くのは、ボード全体でフォーム/フレームの継承を必要とするよりも簡単でした。私のソリューションでは、プレゼンターのコンストラクターは、モデル、ビュー、および「MVP名」の3つのパラメーターを取りました。現在のシナリオに固有の設定をロードするために、MVPの名前を使用しました。

    関連する問題