MVC/MVVM n'est pas une ou bien choix.
Les deux modèles apparaissent, de manière différente, dans le développement ASP.Net et Silverlight/WPF.
Pour ASP.Net, MVVM est utilisé pour reliure à double sens les données dans les vues. Il s'agit généralement d'une mise en œuvre côté client (par exemple, à l'aide de Knockout.js). MVC, quant à lui, est un moyen de séparer les préoccupations. du côté du serveur .
Pour Silverlight et WPF, le modèle MVVM est plus englobant et peut apparaître pour remplacer le MVC (ou d'autres modèles d'organisation des logiciels en responsabilités distinctes). Une hypothèse, qui ressortait fréquemment de ce modèle, était que le modèle ViewModel
a simplement remplacé le contrôleur dans MVC
(comme si vous pouviez simplement remplacer VM
pour C
dans l'acronyme et tout serait pardonné)...
Le ViewModel fait pas ne remplace pas nécessairement le besoin de contrôleurs séparés.
Le problème est le suivant : pour être testable indépendamment*, et surtout réutilisable en cas de besoin, un modèle de vue n'a aucune idée de la vue qui l'affiche, mais plus important encore aucune idée de l'origine de ses données .
*Remarque : dans la pratique, les contrôleurs suppriment la plupart de la logique du ViewModel, qui nécessite des tests unitaires. La VM devient alors un conteneur muet qui nécessite peu, voire pas, de tests. C'est une bonne chose car la VM n'est qu'un pont entre le concepteur et le codeur, et doit donc rester simple.
Même en MVVM, les contrôleurs contiennent généralement toute la logique de traitement et décident quelles données afficher dans quelles vues en utilisant quels modèles de vues.
D'après ce que nous avons vu jusqu'à présent, le principal avantage du modèle ViewModel est de supprimer le code du code-behind XAML. pour faire de l'édition de XAML une tâche plus indépendante . Nous créons toujours des contrôleurs, au fur et à mesure des besoins, pour contrôler (sans mauvais jeu de mots) la logique globale de nos applications.
Les directives MVCVM de base que nous suivons sont les suivantes :
- Vues afficher une certaine forme de données . Ils n'ont aucune idée de l'origine des données.
- ViewModels contenir une certaine forme de données et de commandes ils ne savent pas d'où viennent les données, ou le code, ni comment elles sont affichées.
- Modèles contiennent les données réelles (divers contextes, magasins ou autres méthodes)
- Les contrôleurs écoutent les événements et les publient. Les contrôleurs fournissent la logique qui contrôle quelles données sont vues et où. Les contrôleurs fournissent le code de commande au ViewModel afin que ce dernier soit réellement réutilisable.
Nous avons également noté que le Cadre de génération de code Sculpture met en œuvre MVVM et un modèle similaire à Prism ET il fait également un usage intensif des contrôleurs pour séparer toute la logique des cas d'utilisation.
Ne supposez pas que les contrôleurs sont rendus obsolètes par les modèles de vue.
J'ai ouvert un blog sur ce sujet que je compléterai au fur et à mesure (archives uniquement car l'hébergement a été perdu). . La combinaison de MVCVM avec les systèmes de navigation courants pose des problèmes, car la plupart des systèmes de navigation n'utilisent que des vues et des VM, mais j'y reviendrai dans des articles ultérieurs.
L'utilisation d'un modèle MVCVM présente un avantage supplémentaire. Seuls les objets du contrôleur doivent exister en mémoire pendant toute la durée de vie de l'application. et les contrôleurs contiennent principalement du code et peu de données d'état (c'est-à-dire une surcharge de mémoire minime). Cela donne des applications beaucoup moins gourmandes en mémoire que les solutions où les modèles de vue doivent être conservés et c'est idéal pour certains types de développement mobile (par exemple Windows Mobile utilisant Silverlight/Prism/MEF). Cela dépend bien sûr du type d'application, car vous pouvez toujours avoir besoin de conserver les VMs en cache occasionnelles pour la réactivité.
Note : Ce post a été modifié de nombreuses fois, et ne ciblait pas spécifiquement la question étroite posée, j'ai donc mis à jour la première partie pour couvrir cela aussi. Une grande partie de la discussion, dans les commentaires ci-dessous, ne concerne que l'ASP.Net et non l'image plus large. Ce billet avait pour but de couvrir l'utilisation plus large de MVVM dans Silverlight, WPF et ASP.Net et d'essayer de décourager les gens de remplacer les contrôleurs par des ViewModels.
82 votes
Notez que si MVVM a été inventé par Microsoft, de nombreux développeurs et projets non-Microsoft ont commencé à adopter ce modèle. Ce commentaire vous a été apporté par le département "spite-the-MS-haters".
3 votes
Ayant travaillé avec MVVM pendant longtemps, ma première expérience avec MVC a été frustrante, jusqu'à ce que j'apprenne que je pouvais faire passer des ViewModels dans les deux sens au navigateur en utilisant les techniques de liaison trouvées dans MVVM. Mais comme Joel l'a dit plus haut, la seule façon de récupérer l'état du navigateur est d'afficher les changements dans un formulaire (qui utilise des paires nom/valeur). Si vous ne comprenez pas bien ce point. Vous aurez du mal avec MVC. Considérez simplement le contrôleur comme un injecteur de dépendances pour la vue et vous serez prêt.
6 votes
Une question aussi votée sur les [design patterns] de haut niveau. J'aimerais suggérer l'utilisation de diagrammes dans les réponses.
1 votes
Il faut également reformuler la question pour refléter le fait que la question est posée dans le contexte des technologies Microsoft... bien que la réponse acceptée ne le soit pas.
5 votes
Voici une version archivée de l'article de Joel : web.archive.org/web/20150219153055/http://joel.inpointform.net/
4 votes
Contrairement à la méthode MVC, le ViewModel n'est pas un contrôleur. Il agit plutôt comme un liant qui lie les données entre la vue et le modèle. Alors que le format MVC est spécifiquement conçu pour créer une séparation des préoccupations entre le modèle et la vue, le format MVVM avec liaison des données est conçu spécifiquement pour permettre à la vue et au modèle de communiquer directement entre eux. hackernoon.com/
0 votes
Exemples de code de Design Patterns dans différents langages : C#, C++, Go, Java, JavaScript, Python et Swift.