MVP: Должен ли View реализовывать интерфейс докладчика или наоборот? - PullRequest
15 голосов
/ 22 июля 2010

Я делаю свои первые шаги с GWT. У меня есть вопрос после прочтения:

В первом примере Presenter определяет интерфейс для View.

public class ContactsPresenter implements Presenter {
  ...
  public interface Display extends HasValue<List<String>> {
    HasClickHandlers getAddButton();
    HasClickHandlers getDeleteButton();
    HasClickHandlers getList();
    void setData(List<String> data);
    int getClickedRow(ClickEvent event);
    List<Integer> getSelectedRows();
    Widget asWidget();
  }
}

А во втором View определяет интерфейс для Presenter.

public interface ContactsView<T> {

  public interface Presenter<T> {
    void onAddButtonClicked();
    void onDeleteButtonClicked();
    void onItemClicked(T clickedItem);
    void onItemSelected(T selectedItem);
  }

  void setPresenter(Presenter<T> presenter);
  void setColumnDefinitions(List<ColumnDefinition<T>> columnDefinitions);
  void setRowData(List<T> rowData);
  Widget asWidget();
}

В чем идея этого различия?

Какой мне выбрать?

Ответы [ 3 ]

2 голосов
/ 14 сентября 2010

@ deepak это действительные проблемы. Слово - это зараженная реализация, а не определение.

Позвольте мне объяснить. В первом примере докладчики заключают договор о том, что представление должно реализовывать другими словами, что должно быть реализовано представлениями в классическом подходе MVP.

Вещи запутываются во втором примере. Где Presenter не имеет никакого контроля над тем, что представление должно реализовывать. Это не MVP, и Google называет его MVP. При таком подходе вы не можете проверить представления с помощью JRE / модульных тестов. Это не делает его плохим, хотя просто не MVP и Google не должен называть этот MVP, или они должны объяснить, почему это MVP?

@ Saket Bansal, разделение интерфейса - неправильный подход. Это приведет к тому, что по мере роста приложения будет сложно поддерживать код.

По-моему, вы можете использовать любой из этих подходов, я помню, что в Google некоторые говорили, что первый работал для них для adwords, а второй для волны.

Так же, как вы должны смотреть на фреймворки, такие как GWTP или ERRAI из jboss

2 голосов
/ 22 июля 2010

Я думаю, что вы должны были использовать слово «определяет» в вашем вопросе вместо «реализует», и если это так, то не имеет значения, какой класс определяет интерфейс.

Вы можете сделать что-то другое, определив интерфейсы в своих собственных файлах.В конце концов, все, что имеет значение, это Presenter, реализующий интерфейс Presenter, и View, реализующий интерфейс View.

0 голосов
/ 22 июля 2010

Во втором уроке код был изменен на использование интерфейса Presenter (определенного в представлении), чтобы приспособиться к использованию универсальных UiBinders и Java. Я думаю, что интерфейс Presenter был перенесен в интерфейс View, поскольку они оба используют один и тот же общий T.

...