MVP (Supervising Controller) ¿La vista actualiza el modelo?

8

He estado leyendo sobre MVP, específicamente Supervising Controller. Una cosa que tengo dificultades para entender es cómo interactúa la Vista con el Modelo.

Entendí que el presentador debería actualizar el modelo y que la vista se lee desde el modelo. El presentador también puede actualizar la vista a través de una interfaz. El artículo de Martin Fowler sobre esto parece mostrar exactamente eso ( http://martinfowler.com/eaaDev/SupervisingPresenter.html ).

Sin embargo, otros artículos / blogs muestran la vista actualizando el modelo directamente ( https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other- patrones de presentación separados / ).

Sé que estos son solo patrones, por lo que habrá diferentes implementaciones, pero la vista que actualiza el modelo parece estar haciendo mucho más de lo que debería.

Digamos, por ejemplo, que tenía una clase de persona que contenía un nombre y número de teléfono. La vista puede mostrar este nombre y número y un botón de enviar para cambiar el nombre y el número de la persona. Cuando se hace clic en el botón Enviar, esperaría que la actualización se maneje en el Presentador, no en la Vista. Sin embargo, el artículo al que hice referencia propone que la vista puede actualizar directamente el modelo.

Entonces, ¿debería la vista actualizar el modelo? ¿O debería ser solo el presentador?

EDITAR:

Código del artículo de MSDN:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}
Eric
fuente

Respuestas:

6

Existen varias variantes del MVP desde su diseño original en 1996 por Mike Potel . Martin Fowler analiza algunos de ellos en otro artículo sobre arquitectura GUI .

Una de las diferencias clave entre las variantes es si la vista está totalmente aislada del modelo o no:

  • En el primer caso, el presentador es el hombre en medio de una "vista pasiva" y el modelo.
  • En el segundo caso, el presentador es un "controlador supervisor", pero hay interacciones directamente entre la vista y el modelo. El documento de Potel describe bien el tipo de interacciones: la vista puede solicitar datos del modelo, y el modelo puede notificar la vista de algunos eventos.

En ninguno de los casos la vista cambiaría directamente el modelo. El cambio del modelo siempre se realiza a través del presentador (o el controlador en un MVC).

Observación 1: El artículo de MSDN muestra solo una flecha directamente desde la vista al modelo, en su introducción en la parte MVC (Controlador de vista de modelo). La flecha está en la dirección incorrecta, pero el texto es correcto: la vista puede acceder al modelo y cambiarse a sí misma (es decir, no al modelo, pero se vuelve a dibujar) al cambiar los datos del modelo.

Observación 2: El artículo de MSDN también muestra el patrón MVVM de Microsoft, que es más o menos un MVP, pero el presentador se llama ambiguamente "ViewModel". Pero, de nuevo, la Vista no actualiza el modelo directamente.

Tu edición:

El código de su edición muestra un enlace de datos bidireccional, donde la actualización de datos en la vista activaría directamente un cambio en el modelo. De hecho, esto contradice el patrón MVP original donde la Vista informa al Presentador de los cambios deseados a través de un "Interactor" y el Presentador tiene el monopolio de invocar "Comandos" para actualizar el Modelo.

Observación 3: Creo que el autor de este blog de MSDN estaba más interesado en presentar la arquitectura MVVM que en escribir un artículo exhaustivo, como lo hizo Martin Fowler, en las otras arquitecturas. También creo que la arquitectura de enlace de datos ADO de Microsoft que se remonta a los primeros días del marco .net favoreció un diseño tan mixto e hizo que un MVP clásico fuera menos trivial de implementar (requería un DataObjectSource para aislar el acceso al modelo de datos).

Christophe
fuente
1
Gracias por la respuesta. Hice una edición a mi pregunta. El artículo de MSDN explica el controlador de supervisión MVP y muestra dónde se pasa el modelo como parámetro en el método UpdatePersonalData. Ese método luego actualiza directamente el modelo. Eso parece contradecir lo que está diciendo cuando dice "En ningún caso la vista cambiaría directamente el modelo. El cambio del modelo siempre se realiza a través del Presentador (o el controlador en un MVC)". Realmente no me gusta la idea de que el modelo se actualice en la vista y estoy de acuerdo con su interpretación. ¿Es eso, solo interpretación?
Eric
1
@EricS Creo que el autor de este artículo del blog de MSDN malinterpretó el término "acceso a datos" en MVP como un enlace de datos bidireccional. Edité mi respuesta para resaltar eso.
Christophe
1
@EricS Por cierto, se confirma que el término enlace de datos entre vista y modelo está restringido en el artículo de Martin Fowler "La vista generalmente usa alguna forma de enlace de datos para llenar gran parte de la información de sus campos. Donde el enlace de datos no está activo a interacciones más complejas que el controlador interviene ".
Christophe
1
Todavía estoy tratando de entender el enlace de datos y lo que realmente es y no es. Sin un marco para hacer ningún enlace de datos por mí, ¿puedo implementar el enlace de datos yo solo usando getters y setters? En ese caso, si quisiera implementar solo un enlace de datos unidireccional, solo tendría un captador que obtenga datos del modelo, pero nunca actualice el modelo. En cambio, la actualización del modelo se delegaría al presentador.
Eric
1

Del artículo de Supervising Presenter de Fowler que vinculó en su pregunta:

Factorice la IU en una vista y un controlador donde la vista maneja la asignación simple al modelo subyacente y el controlador maneja la respuesta de entrada y la lógica de vista compleja.

Dice claramente que para todas las tareas simples, la vista puede hablar directamente con el modelo. Por lo tanto, no contradice el artículo de MSDN. Esto es exactamente porque para un mapeo / enlace simple de propiedades no necesita involucrar otra capa ya que esto solo complicaría las cosas sin mucho beneficio.

Nuevamente, Fowler habla sobre esto al final del artículo:

[...] el problema de la conducción es cuánto comportamiento dejar en la vista. La Vista pasiva es un patrón muy similar al Controlador supervisor, pero con la diferencia de que la Vista pasiva coloca todo el comportamiento de actualización de la vista en el controlador, incluidos los casos simples. Esto da como resultado una programación adicional, pero significa que todo el comportamiento de la presentación es comprobable. La elección entre los dos depende del tipo de soporte de enlace de datos que tenga y si está contento de dejarlo sin probar en las pruebas del controlador.

Debes tener en cuenta algunas cosas:

  • Asegúrese de que en todo momento el modelo sea el "maestro" de sus datos. Esto significa que la Vista nunca debe escribir directamente en los campos del modelo (de todos modos, una mala idea). Las propiedades están bien si su idioma las admite. De esta manera, el modelo aún puede reaccionar ante cualquier actualización de sus datos (por ejemplo, calculando otro campo).
  • No acople su modelo a la vista. El modelo debe poder probarse de forma independiente y, en principio, debería poder cambiar la vista sin afectar el modelo. Esto significa que el modelo nunca debería llamar directamente a la vista. Utilice interfaces, o probablemente lo mejor aquí, el patrón Observador. La Vista puede suscribirse al modelo para actualizaciones.
  • Nunca coloque ninguna lógica (comercial) en la Vista. Si se encuentra escribiendo ifdeclaraciones en el código de vista, piense si deberían pertenecer al presentador o modelo.
jhyot
fuente