MVP: должен ли вид реализовывать интерфейс докладчика или наоборот?


Я делаю свои первые шаги с 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 15

3 ответа:

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

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

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

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

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

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

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

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

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