developer mvvm

mvvm android developer



¿Cuáles son los pros y los contras de View-first vs. ViewModel-first en el patrón MVVM (6)

Advertencia: uso WPF, no Silverlight.

Cuando la máquina virtual crea una instancia de la V (que es la forma en que lo hago), la vista es independiente y se puede usar independientemente de la máquina virtual (por ejemplo, en un diseñador)

Personalmente, me estoy desviando hacia una MVVMC (modelo, vista, modelo de vista, controlador) donde tengo una clase de control que ejemplifica ViewModels y vistas y ''las une''. El C también maneja la obtención de datos (y el almacenamiento en caché, etc.) y cualquier comunicación entre VM y V (por ejemplo, si se crea una instancia de V, enruta un comando a su VM para realizar alguna acción, la VM probablemente le preguntará a la C la acción en su nombre; la C puede entonces generar eventos apropiados que otras máquinas virtuales pueden manejar

Si (usando un controlador o no) necesito una VM para hablar con otra VM, es más difícil hacerlo si la V ejemplifica una VM - porque no tengo que exponer la VM en la V (o al menos hacer alguna interfaz) disponible para que el segundo VM pueda hablar con el 1er).

Estoy dando una presentación sobre el uso de MVVM en aplicaciones del mundo real y estoy incluyendo una sección sobre las decisiones de diseño de guerras religiosas involucradas al usar MVVM como un patrón en su aplicación. En una aplicación de MVVM hay dos formas principales (que yo conozco) de crear una instancia de un nuevo par de View / ViewModel:

  1. Ver-Primero en el que crea una vista y crea su propio modelo de vista y lo establece en su DataContext.
  2. ViewModel-First en el que crea nuevos modelos de vista y crea vistas nuevas en respuesta a cambios en las propiedades de ViewModel, generalmente con ItemsControls y / o DataTemplates.

En su experiencia, ¿cuáles son los pros y los contras de cada método? ¿Qué habilitan y qué problemas se topan con cada uno?

Resumen de los resultados

  • Ver Primero - Pros
    • Fácil de rastrear qué ViewModel utiliza una Vista
  • Ver primero - Contras
    • No permite que una sola Vista se use fácilmente con múltiples ViewModels
    • Requiere eventos adicionales para manejar la comunicación entre Views y ViewModels
  • ViewModel First - Pros
    • Permite pruebas más completas de la lógica para abrir nuevas Vistas y Modelos de Vista
    • Tiende a ser SECO a medida que las aplicaciones se hacen más grandes
    • View y ViewModel son más independientes y se pueden trabajar por separado más fácilmente
  • ViewModel First - Contras
    • Más difícil de configurar en Silverlight sin DataTemplateSelector y plantillas de datos tipeadas.

Dada la función de Templating de datos en WPF, creo que ViewModel-First es la forma en que WPF estaba destinado a ser utilizado.

Aclararé esa afirmación: la plantilla de datos le permite nunca crear instancias de vistas desde su ViewModel. Si se hace correctamente, sus Vistas y Modelos de Vista se pueden mantener en proyectos separados que NO se referencian entre sí. Además, el proyecto ViewModel ni siquiera debería hacer referencia a ningún ensamblado de PresentationFramework, lo que hace que el usuario de ViewModels sea consumible.


Hemos usado ViewModel primero, pero cuando llegó el outsourcing, y el uso de blend se convirtió en lo más importante, mi jefe dijo que View-first es mejor que Viewmodel-first - No estaba de acuerdo con él (pero uno para muchos no es la mejor ratio de votos ;-)), porque ahora tenemos algunas conexiones extrañas con eventos de vista en el código subyacente. Ahora estoy en punto de no retorno y me he quedado atrapado en algunos controles personalizados, debido al cambio.


Prefiero usar el primer enfoque del modelo de vista. Por muchas razones:

  • Vms es su aplicación que contiene la mayor parte de la lógica además del código de pegamento en forma de comportamientos o factores desencadenantes.
  • Si crea vistas, entonces usted es responsable de su vida y el código de limpieza. Tienes que ocuparte de enhebrar y otros problemas que son difíciles de probar. Por otro lado, usted crea vms y deja la lógica de creación de vistas con WPF a través de la plantilla de datos ... no tiene que preocuparse por el problema del subprocesamiento. Y habrá una mejor separación de preocupaciones.
  • Con vm primer enfoque cero código detrás.
  • Con un aislamiento de nivel de proyecto para view y vms, puede restringir a los desarrolladores que utilizan elementos específicos de la vista como dispatcher en el modelo de vista, dejando una base de código más limpia y comprobable. Es decir, ver proyecto sprojec a vm. Y el proyecto vm no debe hacer referencia a ninguna presentación lib.
  • Si hay un límite claro entre view y vm. Ambos pueden evolucionar y serán menos frágiles.

Tiendo a preferir el modelo de vista primero simplemente porque siento que sigue la regla DRY mejor. Cuando comienzas a crear aplicaciones a mayor escala, considero que esto también hace que las pruebas sean más fáciles, por lo que pesa más que el dolor de cabeza inicial que debes enfrentar al configurar la aplicación.


Utilizo un enfoque Vista primero (sort-of). Defino View en colaboración con mi cliente con un modelo de vista ficticio con datos de prueba. Cuando estamos satisfechos, procedo a extraer una interfaz del ''dummy'' e implementar el ViewModel real. He encontrado este enfoque más atractivo por las siguientes razones:

  • Es rápido, ya que el prototipado es costoso en cuanto al tiempo y a menudo lo hago bien (ish) en el cuarto o quinto intento.
  • ViewModels tiende a ser fácil (más fácil) de implementar cuando tengo una interfaz a la que adherirme.

Trabajo en WPF, pero creo que no sería muy diferente en SL. Además, nunca dedico tiempo a probar vistas que pueden atribuirse a mi elección de enfoque.