¿Cuáles son las mejoras de MVP sobre MVC?

49

He leído durante tres días sobre los patrones Model-View-Controller (MVC) y Model-View-Presenter (MVP) . Y hay una pregunta que me molesta mucho. ¿Por qué los diseñadores de software inventaron MVP, cuando ya había un MVC?

¿Qué problemas enfrentaron, que MVC no resolvió (o resolvió mal), pero MVP puede resolver? ¿Qué problemas pretende resolver MVP?

He leído muchos artículos sobre la historia y la explicación de MVP, o sobre las diferencias entre MVC y MVP, pero ninguno tenía una respuesta clara a mis preguntas.

En uno de los artículos que leí, se decía:

Ahora en Model View Presenter, que fue una respuesta a las deficiencias del patrón MVC cuando se aplicó a las interfaces gráficas de usuario modernas basadas en componentes. En los sistemas GUI modernos, los componentes de la GUI manejan la entrada del usuario, como los movimientos del mouse y los clics, en lugar de un controlador central.

Entonces, no puedo entender, pero ¿puede ser de otra manera, de modo que los componentes de la GUI no manejen la entrada del usuario por sí mismos? ¿Y qué significa exactamente "manejar por sí mismos"?

Víctor
fuente
44
Duplicado de stackoverflow.com/questions/2056/…
qwerty_so
44
Creo que es solo "La ropa nueva del emperador", una nueva palabra de moda de Mickeysoft.
qwerty_so
44
Victor, ¿tienes una pregunta específica además de "¿por qué hay dos patrones diferentes?" Hay dos patrones diferentes porque resuelven el mismo problema de dos maneras diferentes. Si ayuda, el Modelo y la Vista son esencialmente los mismos en ambos patrones. Concéntrese en las diferencias entre un controlador y un presentador. Puedes encontrar más ayuda aquí: linkedin.com/pulse/…
Robert Harvey
18
"He leído durante tres días sobre los patrones MVC y MVP". Yikes Te sugiero que vayas a tomar un relajante baño caliente o te saltes algunas piedras en un estanque lleno de patos o algo así. ¡Ese tipo de lectura puede, en ausencia de cualquier aplicación práctica, realmente derretir tu cerebro!
user1172763
11
La forma en que obtiene el tipo de respuesta que desea es creando algo usando estos patrones. Entonces serás iluminado.
Robert Harvey

Respuestas:

63

MVC es conceptualmente elegante:

  • la entrada del usuario es manejada por el controlador
  • el controlador actualiza el modelo
  • el modelo actualiza la vista / interfaz de usuario
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

Sin embargo: el flujo de datos y eventos en MVC es circular. Y la vista a menudo contendrá lógica significativa (como controladores de eventos para acciones de usuario). En conjunto, estas propiedades hacen que el sistema sea difícil de probar y difícil de mantener.

La arquitectura MVP reemplaza el controlador con un presentador, que media entre la vista y el modelo. Esto linealiza el sistema:

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

Esto tiene las siguientes ventajas:

  • La lógica (como los controladores de eventos y el estado de la interfaz de usuario) se puede mover de la vista al presentador.

  • La interfaz de usuario se puede probar en términos de presentador, ya que describe el estado de la interfaz de usuario. Dentro de la prueba de la unidad, reemplazamos la vista con un controlador de prueba que realiza llamadas al presentador.

  • Dado que la interfaz de usuario está aislada de la lógica de la aplicación, ambas se pueden desarrollar de forma independiente.

Pero también hay algunos inconvenientes en este enfoque:

  • Se requiere más esfuerzo.
  • El presentador puede mutar fácilmente en una "clase de dios" imposible de mantener.
  • La aplicación no tiene un solo eje MVP, sino múltiples ejes: uno para cada pantalla / ventana / panel en la interfaz de usuario. Esto puede simplificar su arquitectura o complicarla demasiado.
amon
fuente
77
Buena respuesta, pero el MVC de hoy en día generalmente no hace mucho uso (si lo hay) de controladores de eventos, excepto tal vez para la validación de formularios locales, y no considero que esos eventos sean parte del MVC adecuado. Por eso tenemos MVP y MVVM. MVC es esencialmente del lado del servidor.
Robert Harvey
@amon, gracias por tu respuesta, me dice muchas cosas. Y usted menciona que tener varios ejes en la aplicación puede simplificar la arquitectura. Encuentro esa idea en muchos documentos, y se mencionó, como una de las principales razones para inventar MVP, porque MVC no cumple con los requisitos complejos de GUI. Es decir, ¿qué requisitos cumple MVP y cómo resuelve esos requisitos? Perdón por ser tan persistente, pero REALMENTE deseo entenderlo bien.
Victor
44
@Victor No existe el mejor patrón, pero las compensaciones son diferentes. MVC puede ser compatible con requisitos complicados. En términos de arquitectura, MVP impone una relación 1: 1 entre vistas y presentadores: cada vista tiene su propio presentador, cada presentador está conectado a una vista. En MVC, existe una relación n: m: una vista puede enviar la entrada del usuario a múltiples controladores diferentes, y un controlador puede recibir información de muchas vistas. Eso es más flexible, pero también más caótico: no hay un "eje" claro en MVC.
amon
1
@Victor No tengo mucha experiencia con las GUI, por lo que probablemente haya mucho que no mencioné. La última GUI que hice fue un desastre absoluto porque no sabía nada sobre MVP en ese momento: un flujo de datos y control linealizado habría sido una gran mejora.
amon
99
@RobertHarvey Diría que lo que la web llama "MVC" nunca fue realmente "MVC" según la definición original. Quien haya secuestrado el acrónimo debe ser golpeado en la cabeza por elegir un término cargado y confundir a todos.
jpmc26
6

En MVP, el presentador reemplaza el controlador de MVC. La diferencia entre los dos es que el presentador manipula directamente la vista. Está diseñado para marcos de UI que se basan principalmente en eventos (como Windows Forms) sin un gran soporte para enlace de datos enriquecido que se prestaría al patrón MVVM (como WPF). De lo contrario, gran parte de la lógica para administrar el estado de la vista y actualizar el modelo de respaldo estaría en la vista misma.

Michael Brown
fuente