¿Qué son MVP y MVC y cuál es la diferencia?
Al mirar más allá de la forma RAD (arrastrar, soltar y configurar) de crear interfaces de usuario que recomiendan muchas herramientas, es probable que se encuentre con tres patrones de diseño llamados Model-View-Controller , Model-View-Presenter y Model-View-ViewModel . Mi pregunta tiene tres partes:
- ¿Qué cuestiones abordan estos patrones?
- ¿En qué se parecen?
- ¿En qué se diferencian?
Modelo-Vista-Presentador
En MVP , el presentador contiene la lógica empresarial de la interfaz de usuario para la vista. Todas las invocaciones desde la Vista se delegan directamente al Presentador. El Presentador también está desacoplado directamente de la Vista y le habla a través de una interfaz. Esto es para permitir burlarse de la Vista en una prueba unitaria. Un atributo común de MVP es que tiene que haber mucho envío bidireccional. Por ejemplo, cuando alguien hace clic en el botón "Guardar", el controlador de eventos delega en el método "OnSave" del Presentador. Una vez que se completa el guardado, el Presentador volverá a llamar a la Vista a través de su interfaz para que la Vista pueda mostrar que el guardado se ha completado.
MVP tiende a ser un patrón muy natural para lograr presentaciones separadas en WebForms. La razón es que la Vista siempre la crea primero el tiempo de ejecución de ASP.NET. Puedes obtener más información sobre ambas variantes .
Dos variaciones principales
Vista pasiva: la vista es lo más tonta posible y contiene casi cero lógica. Un Presentador es un intermediario que habla con la Vista y el Modelo. La Vista y el Modelo están completamente protegidos entre sí. El Modelo puede generar eventos, pero el Presentador se suscribe a ellos para actualizar la Vista. En la Vista pasiva no hay enlace de datos directo; en cambio, la Vista expone las propiedades del definidor que el Presentador usa para configurar los datos. Todo el estado se gestiona en el Presentador y no en la Vista.
- Pro: superficie máxima de comprobabilidad; separación limpia de la Vista y el Modelo
- Desventaja: más trabajo (por ejemplo, todas las propiedades del definidor) ya que usted mismo realiza todos los enlaces de datos.
Controlador supervisor: el presentador maneja los gestos del usuario. La Vista se vincula al Modelo directamente mediante el enlace de datos. En este caso, es trabajo del Presentador pasar el Modelo a la Vista para que pueda vincularse a él. El Presentador también contendrá lógica para gestos como presionar un botón, navegación, etc.
- Ventaja: al aprovechar el enlace de datos, se reduce la cantidad de código.
- Desventaja: hay una superficie menos comprobable (debido al enlace de datos) y hay menos encapsulación en la Vista ya que habla directamente con el Modelo.
Modelo-Vista-Controlador
En MVC , el Controlador es responsable de determinar qué Vista mostrar en respuesta a cualquier acción, incluso cuando se carga la aplicación. Esto difiere de MVP donde las acciones se dirigen a través de la Vista al Presentador. En MVC, cada acción en la Vista se correlaciona con una llamada a un Controlador junto con una acción. En la web cada acción implica una llamada a una URL al otro lado de la cual hay un Controlador que responde. Una vez que ese Controlador haya completado su procesamiento, devolverá la Vista correcta. La secuencia continúa de esa manera durante toda la vida de la aplicación:
Acción en la vista -> Llamada al controlador -> Lógica del controlador -> Controlador devuelve la Vista.
Otra gran diferencia sobre MVC es que la Vista no se vincula directamente al Modelo. La vista simplemente se representa y es completamente apátrida. En las implementaciones de MVC, la Vista generalmente no tendrá ninguna lógica en el código subyacente. Esto es contrario a MVP, donde es absolutamente necesario porque, si la Vista no delega al Presentador, nunca será llamada.
Modelo de presentación
Otro patrón a tener en cuenta es el patrón Modelo de presentación . En este patrón, no hay presentador. En cambio, la Vista se vincula directamente a un Modelo de Presentación. El modelo de presentación es un modelo diseñado específicamente para la vista. Esto significa que este modelo puede exponer propiedades que uno nunca incluiría en un modelo de dominio, ya que sería una violación de la separación de preocupaciones. En este caso, el modelo de presentación se vincula al modelo de dominio y puede suscribirse a eventos provenientes de ese modelo. Luego, la Vista se suscribe a los eventos provenientes del Modelo de presentación y se actualiza en consecuencia. El modelo de presentación puede exponer comandos que la vista utiliza para invocar acciones. La ventaja de este enfoque es que esencialmente puede eliminar el código subyacente por completo, ya que el PM encapsula completamente todo el comportamiento de la vista. Este patrón es un candidato muy fuerte para su uso en aplicaciones WPF y también se llama Model-View-ViewModel .
Hay un artículo de MSDN sobre el modelo de presentación y una sección en la Guía de aplicaciones compuestas para WPF (anteriormente Prism) sobre patrones de presentación separados.
Esta es una simplificación excesiva de las muchas variantes de estos patrones de diseño, pero así es como me gusta pensar sobre las diferencias entre los dos.
mvc
MVP
Escribí un blog sobre esto hace un tiempo, citando la excelente publicación de Todd Snyder sobre la diferencia entre los dos :
Estas son las diferencias clave entre los patrones:
Patrón MVP
- La vista está más vagamente acoplada al modelo. El presentador es responsable de vincular el modelo a la vista.
- Es más fácil realizar pruebas unitarias porque la interacción con la vista se realiza a través de una interfaz.
- Por lo general, ve el mapa del presentador uno a uno. Las vistas complejas pueden tener varios presentadores.
Patrón MVC
- Los controladores se basan en comportamientos y se pueden compartir entre vistas
- Puede ser responsable de determinar qué vista mostrar
Es la mejor explicación que pude encontrar en la web.
Aquí hay ilustraciones que representan el flujo de comunicación.
MVP no es necesariamente un escenario donde la Vista está a cargo (ver MVP de Taligent, por ejemplo).
Me parece desafortunado que la gente siga predicando esto como un patrón (Vista a cargo) en lugar de un antipatrón, ya que contradice "Es solo una vista" (Programador pragmático). "Es sólo una vista" indica que la vista final que se muestra al usuario es una preocupación secundaria de la aplicación. El patrón MVP de Microsoft hace que la reutilización de Vistas sea mucho más difícil y excusa convenientemente al diseñador de Microsoft de fomentar malas prácticas.
Para ser completamente sincero, creo que las preocupaciones subyacentes de MVC son válidas para cualquier implementación de MVP y las diferencias son casi completamente semánticas. Siempre que siga la separación de preocupaciones entre la vista (que muestra los datos), el controlador (que inicializa y controla la interacción del usuario) y el modelo (los datos y/o servicios subyacentes), entonces estará logrando los beneficios de MVC. . Si está logrando los beneficios, ¿a quién le importa realmente si su patrón es MVC, MVP o Supervising Controller? El único patrón real sigue siendo MVC, el resto son solo versiones diferentes del mismo.
Considere este artículo muy interesante que enumera exhaustivamente varias de estas diferentes implementaciones. Puede notar que básicamente todos hacen lo mismo pero de manera ligeramente diferente.
Personalmente, creo que MVP se ha reintroducido recientemente como un término atractivo para reducir las discusiones entre fanáticos semánticos que discuten si algo es realmente MVC o no, o para justificar las herramientas de desarrollo rápido de aplicaciones de Microsoft. Ninguna de estas razones en mis libros justifica su existencia como un patrón de diseño separado.