Para responder a la pregunta, Sí, cada vista debe tener su propio Modelo de vista. Pero no hay necesidad de modelar toda la jerarquía. Solo lo que la vista necesita.
El problema que tuve con la mayoría de los recursos en línea con respecto a MVVM:
En la mayoría de los ejemplos, la Vista es un mapeo casi 1 a 1 del Modelo. Pero en mi escenario, donde hay diferentes puntos de vista para diferentes facetas del mismo Modelo, me encuentro atrapado entre dos opciones:
Un modelo de vista monolítica que utilizan todos los demás modelos de vista
O un modelo de vista para cada vista
Pero ambos no son ideales.
El modelo de vista orientado al modelo (MVM), aunque bajo en duplicación de código, es una pesadilla para mantener
El modelo de vista orientado a la vista (VVM) produce clases altamente especializadas para cada vista, pero contiene duplicados.
Al final, decidí que tener una VM por vista es más fácil de mantener y codificar, así que seguí con el enfoque VVM.
Una vez que el código funciona, comencé a refactorizar todas las propiedades y operaciones comunes en su forma actual y final:
En esta forma final, la clase de modelo de vista común se compone en cada VVM.
Por supuesto, todavía tengo que decidir qué se considera común / especializado. Y cuando se agrega / fusiona / elimina una vista, este equilibrio cambia.
Pero lo bueno de esto es que ahora soy capaz de empujar miembros hacia arriba / abajo de común a VVM y viceversa fácilmente.
Y una nota rápida sobre cómo mantener los objetos sincronizados:
Tener un modelo de vista común se encarga de la mayor parte de esto. Cada VVM puede simplemente tener una referencia al mismo modelo de vista común.
También tiendo a comenzar con métodos simples de devolución de llamada y evolucionar a evento / observador si surge la necesidad de múltiples oyentes.
Y para eventos realmente complejos (es decir, actualizaciones inesperadas en cascada), cambiaría a usar un Mediador.
No evito el código donde un niño tiene una referencia a su padre. Cualquier cosa para que el código funcione.
Y si surge la oportunidad de refactorizar, la aprovecharía.
Las lecciones que aprendí:
- Código feo / de trabajo> Código hermoso / no funciona
- Es más fácil fusionar múltiples clases pequeñas, que dividir una clase enorme