0

私は、これらのうちどれが MVP パターンによりよく適合するかを把握しようとしています。

ViewDesktopImpl クラスに次のコードがあるとしましょう。

class ViewDesktopImpl implements View {

  ValueListBox<Object> valueListBox
}

さて、気になるのはこちら。次のことを行う方が理にかなっていますか?

  1. View インターフェイスに HasConstrainedValue ゲッターがあり、プレゼンターは getHasConstrainedValue を呼び出して入力します

  2. View インターフェイスに setValues(List objects) があり、Presenter が view.setValues を呼び出し、ViewDesktopImpl が valueListBox の設定を処理します。

オプション 1 を選択する方がよいと思います。これについて賛否両論を得たいと思います。これは主観的なパターンかもしれませんが、どのオプションを選択すべきかについて、他の意見や理由を知りたいです。 MVP 標準にどのように準拠しているか。

4

2 に答える 2

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 の実装例:

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);
  }
}

ListBox を使用した MyView の 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));
于 2012-05-11T10:51:37.430 に答える
1

ListBox を MVP として実装したいと思います。のSelectOneListBoxを見てくださいDavid Chandler。あなたの質問が特定のウィジェットに関連していない場合は、ゲッターとセッターを用意するのが良い方法だと思います。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();
}
于 2012-05-10T17:36:33.810 に答える