Pour répondre à la question, Oui, chaque vue doit avoir son propre modèle de vue. Mais il n'est pas nécessaire de modéliser toute la hiérarchie. Seulement ce dont la vue a besoin.
Le problème que j'ai eu avec la plupart des ressources en ligne concernant MVVM:
Dans la plupart des exemples, la vue est une cartographie presque 1: 1 du modèle. Mais dans mon scénario, où il existe différentes vues pour différentes facettes du même modèle, je me retrouve coincé entre deux choix:
Un modèle de vue monolithique utilisé par tous les autres modèles de vue
Ou un modèle de vue pour chaque vue
Mais les deux ne sont pas idéaux.
Le modèle de vue orienté modèle (MVM), bien que faible en duplication de code, est un cauchemar à maintenir
Le modèle de vue orienté vue (VVM) produit des classes hautement spécialisées pour chaque vue, mais contient des doublons.
En fin de compte, j'ai décidé qu'il était plus facile de maintenir et de coder une machine virtuelle par vue, j'ai donc opté pour l'approche VVM.
Une fois que le code fonctionne, j'ai commencé à refactoriser toutes les propriétés et opérations courantes dans leur forme finale actuelle:
Dans cette forme finale, la classe de modèle de vue commune est composée dans chaque VVM.
Bien sûr, je dois encore décider ce qui est considéré comme commun / spécialisé. Et lorsqu'une vue est ajoutée / fusionnée / supprimée, cet équilibre change.
Mais la bonne chose à ce sujet est que je suis maintenant capable de pousser les membres haut / bas du commun vers VVM et vice versa facilement.
Et une note rapide concernant la synchronisation des objets:
Avoir un modèle de vue commune s'occupe de la plupart de cela. Chaque VVM peut simplement avoir une référence au même modèle Common View.
J'ai également tendance à commencer par des méthodes de rappel simples et à évoluer vers un événement / observateur si le besoin de plusieurs auditeurs se fait sentir.
Et pour les événements vraiment complexes (c'est-à-dire les mises à jour en cascade inattendues), je passerais à l'utilisation d'un médiateur.
Je n'ai pas peur du code où un enfant a une référence arrière à son parent. Tout pour faire fonctionner le code.
Et si l'occasion de refactoriser se présentait, je la saisirais.
Les leçons que j'ai apprises:
- Code laid / fonctionnel> Code beau / non fonctionnel
- Il est plus facile de fusionner plusieurs petites classes que de diviser une énorme classe