MVP:A View deve implementar uma interface do Presenter ou vice-versa?
Pergunta
Estou dando meus primeiros passos com GWT
.Eu tenho uma pergunta depois de ler:
- Desenvolvimento de aplicações em larga escala e MVP
- Desenvolvimento de aplicações em larga escala e MVP – Parte II
No primeiro exemplo o Presenter
define a interface para o 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();
}
}
E no segundo, o View
define a interface para o 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();
}
Qual é a ideia dessa diferença?
Qual devo escolher?
Solução
Eu acho que você deveria ter usado a palavra 'define' em sua pergunta em vez de 'implementa' e se for esse o caso, então não importa qual classe define a interface.
Você poderia fazer algo diferente definindo as interfaces em seus próprios arquivos.No final das contas, tudo o que importa é o Presenter implementando a interface do Presenter e o View implementando a interface do View.
Outras dicas
@deepak, essas são preocupações válidas.Word é implementação de infecção, não definição.
Deixe-me explicar .No primeiro exemplo, os apresentadores mantêm o contrato com o que a visão deve implementar, em outras palavras, orienta o que deve ser implementado pelas visualizações, uma abordagem clássica de MVP.
As coisas ficam confusas no segundo exemplo.Onde o Presenter não tem controle sobre qual visão deve ser implementada.Isso não é MVP e o Google está chamando isso de MVP.Não há como testar as visualizações com testes de unidade/JRE usando essa abordagem.Isso não significa que seja ruim, mas não é MVP e o Google não deveria chamar isso de MVP ou eles devem explicar por que é um MVP?
@Saket Bansal separar a interface não é a abordagem correta.Isso resultará em dificuldade de manutenção do código à medida que o aplicativo cresce.
Na minha opinião, você pode adotar qualquer uma das abordagens, lembro-me do Google dizendo alguns onde o primeiro funcionou para eles para o AdWords e o segundo para o Wave.
De qualquer forma, você também deve olhar para estruturas como GWTP ou ERRAI do jboss
No segundo tutorial o código foi alterado para usar uma interface Presenter (definida na view) para acomodar o uso de UiBinders e genéricos Java.Acho que a interface do Presenter foi movida para a interface View, pois ambas compartilham o mesmo T. genérico.