0

WindowsFormをMVPパターンにリファクタリングしようとしています。アプリはタイルエディタです。フォームには、タイルマップ(TileDisplay)を表示するカスタムコントロールがあります。ファイルからマップをロードした後、「AdjustHScrollBar」という名前のメソッドを呼び出して、水平スクロールバーをタイルマップサイズに再調整します。MVPに従ってメソッドを分割する方法が100%わかりません。まず、元のnone MVPメソッド:

private void AdjustHScrollBar()
{
    if (tileMap.GetWidthInPixels() > tileDisplay.Width)
    {
        hTileScrollBar.Visible = true;
        hTileScrollBar.Minimum = 0;
        hTileScrollBar.Maximum = tileMap.GetWidth();
    }
    else
    {
        hTileScrollBar.Visible = false;
    }
}

これは、プレゼンターでMVPを使用した後の方法です。

private void AdjustHScrollBar()
{
    if (mainFormModel.TileMap.GetWidthInPixels() > mainFormView.GetTileDisplayWidth())
    {
        mainFormView.EnableHScrollBar(mainFormModel.TileMap.GetWidth());
    }
    else
    {
        mainFormView.DisableHScrollBar();
    }
}

ビューはプレゼンターを知りません。私の質問は、プレゼンターがビューのコントロールを知っている必要があるかどうかです。私の実装では、GetTileDisplayWidth、EnableHScrollBar、DisableHScrollBarの各メソッドはそうではありません。Afaikは正しい方法ですが、ビューから必要なすべてのプロパティのメソッドを作成する必要がある場合、これは大変な作業になるようです。私は基本的に、たとえば垂直スクロールバーの「同じ」コードを持っています(つまり、スクロールバーを再調整するための6つの方法です)。

4

2 に答える 2

3

レイヤーのポイントは、ビューの詳細、つまりサイズ、色、ビューのタイプ、またはその他のプロパティに関係することを知らなくてもPresenter、レイヤーと通信できるようにすることです。View

通常、はコンストラクターpresenter classを取ります。view object理想的にはAdjust、ビューにメソッドがあり、プレゼンターがそれを直接呼び出す場合があります。さらに理想的には、直接ビュークラスではなく、インターフェイスを介してこれを行う場合があります。

コードでは、ビューのすべてのプロパティにアクセスし、プレゼンターを介してそれらを操作しようとしていますが、ビジネスロジックに何らかの依存関係がない限り、必ずしもそうする必要はありません。したがって、レイヤーですべての操作を実行しViewてから、レイヤーから呼び出すことができますPresenter

MVPには多くのコードが含まれ、それが受け入れなければならないトレードオフです。

于 2013-03-23T22:18:47.490 に答える
1

私はプレゼンターでこのようなことをします:

public interface ITileMapView
{
    event EventHandler<string> TileMapFileLoaded;
    void OnTileMapLoaded(TileMapModel model);
}

public class TileMapPresenter
{
    private readonly ITileMapView view;

    public TileMapPresenter(ITileMapView view)
    {
        this.view = view;
        view.TileMapFileLoaded += OnTileMapFileLoaded;
    }

    private void OnTileMapFileLoaded(object sender, string filename)
    {
        // Parse data from file
        // Populate model

        // Tell view
        view.OnTileMapLoaded(model); //Implement the 'AdjustHScrollBar' logic in the view
    }
}

プレゼンターは、データを取得するタイミングと方法、およびデータを解釈する方法を知っています。プレゼンターにビュー固有のロジックを使用させないでください。

于 2013-03-23T22:50:30.520 に答える