2010-07-22 7 views
15

Estoy dando mis primeros pasos con GWT. Tengo una pregunta después de la lectura:MVP: ¿Debería la View implementar la interfaz de un presentador o viceversa?

En el primer ejemplo el Presenter define el interfaz para la 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(); 
    } 
} 

Y en el segundo, el View define el interfaz para la 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(); 
} 

¿Cuál es la idea de esta diferencia?

¿Cuál debería elegir?

+2

Un presentador debe ser capaz de modificar la vista. Entonces, el presentador solo necesita mantener una referencia a sus puntos de vista. No entiendo qué se ganaría si la vista y el presentador se implementaran entre sí. –

+0

@Abhijeet Kashnia: Estos son dos ejemplos diferentes. Verifique los enlaces, hacen lo mismo pero se implementan de manera diferente. – Macarse

+0

¡Incluso en la gestión de historial con Activity and Places y MVP tenemos actividad implementando una interfaz de visualización! ¿Cómo es ese MVP? –

Respuesta

2

Creo que debería haber usado la palabra 'define' en su pregunta en lugar de 'implements' y si ese es el caso, entonces no importa qué clase define la interfaz.

Puede hacer algo diferente definiendo las interfaces en sus propios archivos. Al final del día, todo lo que importa es el presentador que implementa la interfaz del presentador y la vista que implementa la interfaz de View.

0

En el segundo tutorial, el código se cambió por el uso de una interfaz de Presenter (definida en la vista) para acomodar el uso de UiBinders y genéricos de Java. Creo que la interfaz de Presenter se movió a la interfaz de View ya que ambas comparten el mismo genérico T.

2

@deepak estas son preocupaciones válidas. Word es infección implementación no definición.

Déjame explicarte. En el primer ejemplo, los presentadores mantienen el contrato con lo que la vista debe implementar; en otras palabras, impulsa lo que debería implementarse mediante vistas de un enfoque MVP clásico.

Las cosas se vuelven confusas en el segundo ejemplo. Donde Presenter no tiene control sobre qué vista debe implementar. Esto no es MVP y Google lo llama MVP. No hay manera de que pueda probar las vistas con JRE/pruebas unitarias usando este enfoque. Eso no lo hace malo, ¿no es que MVP y Google no deben llamar a este MVP o deben explicar por qué es un MVP?

@Saket La interfaz de separación Bansal no es el enfoque correcto. Conseguirá un código difícil de mantener a medida que la aplicación crezca.

En mi opinión, puede tomar cualquiera de los dos enfoques, recuerdo que Google dijo algo sobre dónde primero trabajó para ellos para AdWords y segundo para Wave.

Cualquier forma en que también debe mirar a framworks como GWTP o ERRAI de JBoss

Cuestiones relacionadas