最有价值球员: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();
}
这种差异的想法是什么?
我应该选择哪个?
解决方案
我认为您应该在问题中使用“定义”一词而不是“实现”,如果是这样的话 哪个类定义接口并不重要。
您可以通过在自己的文件中定义接口来执行不同的操作。归根结底,最重要的是实现 Presenter 接口的 Presenter 和实现 View 接口的 View。
其他提示
@deepak 这些都是合理的担忧。单词感染的是实现而不是定义。
让我解释 。在第一个示例中,演示者遵守视图必须实现的约定,换句话说,驱动视图应该实现什么,这是经典的 MVP 方法。
在第二个例子中事情变得混乱。Presenter 无法控制必须实现的视图。这不是 MVP,谷歌称其为 MVP。您无法使用这种方法通过 JRE/单元测试来测试视图。这并不会让事情变得更糟糕,尽管它不是 MVP,而且谷歌不应该称这个 MVP,或者他们必须解释为什么它是 MVP?
@Saket Bansal 分离接口不是正确的方法。随着应用程序的增长,这将导致代码难以维护。
在我看来,你可以采取任何一种方法,我记得谷歌说过,第一种方法适用于 adwords,第二种方法适用于 wave。
不管怎样,你也应该看看 GWTP 或 埃拉伊 来自jboss
在第二个教程中,代码更改为使用 Presenter 接口(在视图中定义)以适应 UiBinder 和 Java 泛型的使用。我认为 Presenter 接口已移至 View 接口,因为它们共享相同的通用 T。
不隶属于 StackOverflow