2012-05-10 9 views
0

これらのうちどれがMVPパターンに適合するかを調べようとしています。GWT ValueListBoxがMVPに準拠

私は、次のコード持っているのは、私のViewDesktopImplクラスで言ってみましょう:今すぐ

class ViewDesktopImpl implements View { 

    ValueListBox<Object> valueListBox 
} 

を、ここで私は思ったんだけど何です。それは、次の操作を行うために、より理にかなって:

  1. は私のビューインタフェースでHasConstrainedValueゲッターを持って、プレゼンターはgetHasConstrainedValueを呼び出し、それを移入

  2. は、私のビューインタフェースでsetValues(一覧オブジェクト)を持っていますプレゼンターはview.setValuesを呼び出し、ViewDesktopImplはvalueListBox私はちょうどこのために長所と短所を取得したいと思い、オプション1を取る方が良いだろうと信じて

移入ハンドル - を、はい、それは主観的なPATTかもしれ私は、どのオプションを取るべきか、それがMVP標準に準拠する方法について、他の意見や理由を得たいと思っています。

答えて

1

MVPとしてListBoxを実装したいと思います。 David ChandlerからSelectOneListBoxを見てください。あなたの質問が特定のウィジェットに関連していない場合、私はgetterとsetterを持つことは良いアプローチだと言います。 HasTextインターフェイスを見てください。

それはあなたのプレゼンターをテストに出たとき、あなたはMockitoを使用してテストデータを設定するために、あなたのビューを模擬します:

@Mock 
MyView view; 

List testValues = ...; 
when(view.getValues().getValues()).thenReturn(testValues); 
result = presenter.method(...); 
assertTrue(result == expected); 

ビューは次のように定義されます。ここ

public interface MyView extends View { 
    HasValueList getValues(); 
} 

public interface HasValueList { 
    void setValues(List objects); 
    List getValues(); 
} 
1

は私が行う方法です私のMVP。

私のプレゼンターが私のビューでゲッターを呼び出すのを覚えています私のビューは私のプレゼンターのメソッドを呼び出す必要があります。このように、ビジネスロジックはプレゼンタに分離され、ビューをモックすることなく簡単にテストできます。

public interface MyView extends View { 
    void setObjectsList(List<Object> objects); 
    void setPresenter(Presenter presenter); 

    interface Presenter { 
    void handleObjectSelected(Object object); 
    } 
} 

プレゼンターはMyView.Presenterを実装しています

class MyPresenter implements MyView.Presenter { 
    private final MyView myView; 
    private List<Object> objects; 

    public MyPresenter(MyView myView, List<Objects> objects) { 
    this.myView = myView; 
    this.objects = objects; 
    } 

    public void initialize() { 
    myView.setPresenter(this); 
    myView.setObjectsList(objects); 
    } 

    @Override 
    public void handleObjectSelected(Object object) { 
    // Do something with selected object. 
    } 
} 

例MYVIEW実装:リストボックスを使用してMYVIEWの

class MyViewImpl implements MyView { 
    private Presenter presenter; 
    ... 

    @Override 
    public void setObjectsList(List<Object> objects) { 
    // Do something with object list. 
    } 

    @Override 
    public void setPresenter(Presenter presenter) { 
    this.presenter = presenter; 
    } 

    public void somethingHappened() { 
    presenter.handleObjectSelected(object); 
    } 
} 

第2の実施例:

class ListBoxMyViewImpl implements MyView { 
    @UiField ListBox listBox; 

    private Presenter presenter; 
    private List<Object> objects; 

    public MyListBoxView() { 
    objects = Lists.newArrayLists(); 
    } 

    @Override 
    public void setObjectsList(List<Object> objects) { 
    this.objects = objects; 
    listBox.clear(); 
    for (Object object : objects) { 
     listBox.addItem(object.toString()); 
    } 
    } 

    @Override 
    public void setPresenter(Presenter presenter) { 
    this.presenter = presenter; 
    } 

    @UiHandler("listBox") 
    void onChange(ChangeEvent e) { 
    presenter.handleObjectSelected(objects.get(listBox.getSelectedIndex()); 
    } 
    ... 
} 

この方法で、あなたプレゼンターのロジックをテストするために視点を模擬する必要はありません。

の代わりに:

@Mock 
MyView view; 

List testValues = ...; 
when(view.getValues().getValues()).thenReturn(testValues); 
result = presenter.method(...); 
assertTrue(result == expected); 

あなたのプレゼンターのロジックをテストします:

List testValues = ...; 
assertEquals(expected, presenter.method(testValues));