¿Cuánto debe saber una vista sobre el modelo?


10

Estoy creando una aplicación en python con un contenedor de python para WPF y con soporte DAG. Actualmente estoy en un punto en el que tengo que decidir una forma consistente de interactuar entre los datos y la vista.

Por lo que veo, actualmente hay dos soluciones obvias.

El primero es similar a cómo están estructuradas las aplicaciones de Android. Tiene un controlador que establece / llena la vista. Por lo tanto, el controlador posee la vista y empuja solo los datos primitivos que se mostrarán. La vista es solo una capa tonta y no tiene idea de lo que está sucediendo y de dónde provienen esos datos. Y luego, si el usuario interactúa con la vista, enviará devoluciones de llamada al controlador (si está registrado).

UserInfoController.py

userInfoView = UserInfoView()
userInfoView.onGenderChangedCallback = self.onGenderChangedCallback 
userInfoView.setUserGenderValue(user.getGender())

UserInfoView.py

def setUserGenderValue(self, gender):
    self.userGender = gender

def getView(self):
    return ui.Label(self.userGender, onEditCallback=self.onGenderChangedCallback)

El segundo es pasar un (referencia de) modelo a la vista y dejar que la vista recupere y actualice los datos. La vista ahora contiene el modelo y, por lo tanto, puede actualizarlo sin ninguna devolución de llamada adicional al controlador.

UserInfoViewModel.py

self.gender = 'Male'

UserInfoView.py

def getView(self):
    return ui.Label(self.ViewModel().getGender(), onEdited=self.genderEdited)

def genderEdited(self, newValue):
    self.ViewModel().setGender(newValue)

Entonces, supongo que lo que estoy preguntando es si debo pasar los datos muy primitivos y mantener la vista lo más genérica posible, luego trabajar con devoluciones de llamada y hacer los detalles comerciales en el controlador.

O debería pasar todo el modelo a la vista y dejar que la vista actualice el modelo directamente. Esto significa que habrá menos código para escribir.

PD. No juzgues el código, es solo para visualización.

EDITAR:

También para agregar : esta aplicación se escribirá en python que admite ducktyping. Esto significa que con el segundo enfoque, la vista sigue siendo reutilizable siempre que el modelo cumpla con la interfaz requerida.

Respuestas:


3

La única "lógica" que debe contener una vista debe ser el código responsable de cambiar el estado visible de la GUI para el usuario. Cualquier código que manipule datos o calcule un valor debe manejarse en otro lugar.

Su vista debe saber cómo se ve el modelo, pero debe ignorar el comportamiento asociado con cualquier cosa que exponga el modelo.

Pasar tipos de datos simples a su vista lo hace responsable tanto de manipular la GUI como de almacenar el estado de la vista, que fácilmente puede volverse difícil de manejar.

Debe pasar el modelo directamente a la vista si el modelo está diseñado para su manipulación por la vista. Si su modelo es el mismo utilizado por su mecanismo de almacenamiento de datos, eso puede causar problemas en el futuro si su representación interna y la representación de vista divergen (como suele suceder).

Básicamente, debe tener una Vista, Modelo de vista, Modelo de datos y algo para manejar la lógica empresarial. Luego, todas sus preocupaciones se separan fácilmente, solo tiene que unirlas.


1

Esta es una respuesta algo generalizada, pero la vista IMO debería hacer la menor cantidad de trabajo posible (por ejemplo, validar las entradas del usuario).

De esta manera, puede esperar que toda su lógica esté en el controlador. Esto hace que sea mucho más fácil mantener el camino, el principio de responsabilidad única y todo eso.


Bueno, en el segundo enfoque, la lógica aún estaría en el modelo de vista y no en la vista.
Arturs Vancans
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.