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

Я делаю первые шаги с 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();
}

Какова идея этой разницы?

Что выбрать?

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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