Je ne suis pas trop heureux avec les questions / réponses, donc je vais ajouter mon propre:
Quand évitez les motifs
Pour un niveau suffisamment simple demande à chaque modèle de conception est exagéré. Supposons que vous écrivez une application graphique qui affiche un unique bouton qui, lorsqu'il est pressé affiche "Hello world". Dans ce cas, les modèles de conception comme MVC, MVP, MVVM tous les ajouter beaucoup de complexité, tout en n'ajoutant pas de quelque valeur que ce soit.
En général, il est toujours une mauvaise décision d'introduire un modèle de conception juste parce qu'il s'adapte un peu. Les modèles de conception devraient être utilisés pour réduire la complexité, soit directement par la réduction globale de la complexité, ou par le remplacement de l'inconnu de la complexité avec des familiers de la complexité. Si le modèle de conception ne peut pas réduire la complexité dans l'une de ces 2 façons, ne l'utilisez pas.
Pour expliquer familier et non familier de la complexité, prenez les 2 séquences de caractères:
- "D.€|Ré%dfà?c"
- "CorrectHorseBatteryStaple"
Tandis que la deuxième séquence de caractères est deux fois la longueur de la première séquence, il est plus facile à lire, plus rapide à écrire, et plus facile à retenir que la première séquence, tous parce qu'il est de plus en plus familiers. Le même est vrai pour des motifs familiers dans le code.
Être conscient du fait que certains modèles peuvent ne pas être familiers à tous les développeurs qui vont travailler avec le code dans l'avenir. Dans les conditions de l'exemple précédent, la séquence suivante peut ou ne peut pas être plus facile à retenir que les séquences ci-dessus, selon les compétences individuelles de la personne à mémoriser: "3.14159265358979323846264338327950". Dans certains cas où les plus avancées des modèles de conception sont en cause, il n'a de sens que pour utiliser un modèle de conception si l'entretien développeurs sont déjà familiers avec elle.
MVVM
Cela dit, nous allons plonger dans le sujet de MVVM par le biais d'un exemple. MVVM guides sur la façon de répartir les responsabilités entre les classes dans une application graphique (ou entre les couches - plus sur cela plus tard), avec l'objectif de disposer d'un petit nombre de classes, tout en gardant un certain nombre de responsabilités par la classe de petite et bien défini.
"Bon" MVVM suppose au moins modérément complexe d'application, qui traite avec des données qu'il obtient à partir de "quelque part". Il peut obtenir les données à partir d'une base de données, un fichier, un service web, ou à partir d'un myrad d'autres sources.
Exemple
Dans notre exemple, nous avons une Vue et un Modèle, mais pas ViewModel. Le Modèle encapsule un fichier csv qui il lit sur le démarrage et l'enregistre quand l'application s'arrête, avec toutes les modifications de l'utilisateur sur les données. La Vue affiche les données du Modèle dans un tableau et permet à l'utilisateur de modifier les données.
Maintenant on nous demande de faire un changement pour notre application. Les données se compose d'un 2-dimensions de la grille qui a déjà une colonne "prix", qui contient un prix en USD. Nous avons besoin d'ajouter une nouvelle colonne qui indique les prix en Euros, en plus de ceux en USD, basés sur l'avancement du taux de change. Le format du fichier csv ne doit pas changer parce que d'autres applications de travail avec le fichier de trop.
Une solution possible est de simplement ajouter une nouvelle colonne à la classe du Modèle. Parce que le Modèle enregistre toutes les données qu'il expose à la Vue à partir d'un fichier csv, et nous ne voulons pas d'un nouveau prix en Euro colonne du fichier csv, la modification du Modèle pourrait être non négligeable. Il serait également difficile de décrire ce que le Modèle de classe.
On pourrait aussi faire le changement dans la Vue, mais actuellement, notre application utilise la liaison de données pour afficher les données directement fournies par notre Modèle de classe. Parce que notre GUI cadre ne nous permet pas d'introduire un supplément de colonne calculée dans une table si la table de données est lié à une source de données, nous aurions besoin de faire un changement significatif de la Vue pour faire ce travail, en faisant le point de Vue beaucoup plus complexe.
Il n'y a pas de ViewModel dans l'application car jusqu'à présent, le Modèle présenté les données exactement de la façon dont la Vue avait besoin. C'est une bonne chose. Parce que le Modèle ne présente plus les données dans la façon dont la Vue a besoin d'elle, nous pouvons maintenant écrire un ViewModel. La nouvelle ViewModel souscrit au Modèle, et expose les données du Modèle de la Vue avec une colonne supplémentaire indiquant le prix en Euros. La Vue ne connaît plus le Modèle, il ne connaît que le ViewModel, qui regarde la même chose pour la Vue comme le Modèle n'a avant - sauf que les exposés de données contient une nouvelle lecture seule colonne.
La prochaine demande de la clientèle est qu'il ne faut pas afficher les données sous forme de lignes dans une table, mais au lieu d'afficher les informations de chaque élément (un.k.un. ligne) comme une carte/boîte, et l'affichage de 20 cases sur l'écran dans un 4x5 grille, montrant 20 cases à la fois. Parce que nous avons gardé la logique de la Vue simple, il nous suffit de remplacer la Vue entièrement avec une nouvelle classe qui fait que les désirs de la clientèle. Si vous êtes dans cette situation avant, vous savez qu'il y a un autre client qui a préféré l'ancien point de Vue. Maintenant, vous avez besoin pour soutenir à la fois, mais parce que l'ensemble de la commune de la logique d'entreprise arrive à être dans le ViewModel qui n'est pas vraiment un problème.
La prochaine demande du client, c'est que nous tirez le taux de change de l'internet, plutôt que d'utiliser un client fourni des taux de change. C'est le point où nous revenir à ma déclaration précédente sur un "couches". Nous ne changeons pas notre Modèle de classe afin de fournir un taux de change. Au lieu de nous écrire (ou trouver) une complètement indépendante de classe supplémentaire fournit le taux de change. Cette nouvelle classe devient une partie de la couche du modèle, et notre ViewModel consolide les informations au format csv-Modèle et le taux de change de Modèle, qu'il présente ensuite à la Vue. Pour ce changement, l'ancien Modèle de la classe et de la classe de la Vue n'ont même pas à être touché.
Si nous n'avions pas introduit le ViewModel lorsque nous avons fait, mais a attendu jusqu'à maintenant pour ce faire, la quantité de travail pour introduire le ViewModel maintenant serait plus élevé parce que nous avons besoin d'éliminer une grande quantité de fonctionnalités à partir à la fois de la Vue et du Modèle, puis déplacer la fonctionnalité dans le ViewModel.
Résumé
- MVVM guides sur la façon de répartir les responsabilités entre les classes dans une application graphique.
- ViewModel projets les données à partir du Modèle dans un format qui s'adapte à la Vue.
- Pour trivial projets MVVM est unnecesary. En utilisant seulement le point de Vue est suffisante.
- Pour des projets simples, le ViewModel/Modèle split peut être inutile.
- Modèle et ViewModel n'ont pas besoin d'exister depuis le début, et peuvent être mises en place lorsqu'elles sont nécessaires.
Conclusion sur les Tests Unitaires
Le but principal de MVVM n'est pas que le code dans le Modèle et le ViewModel peut être mis sous Test Unitaire. Le but principal de MVVM est que le code est divisé en classes, avec un petit nombre de responsabilités bien définies. Un des nombreux avantages d'avoir un code composé de classes avec un petit nombre de responsabilités bien définies, c'est qu'il est plus facile de mettre le code en vertu de l'Unité de Test. Un beaucoup plus grand avantage est que le code est plus facile à comprendre, à maintenir et à modifier.