web-dev-qa-db-fra.com

Avantages de MVVM sur MVC

Enfin de faire du développement de Silverlight et j'ai rencontré MVVM. Je connais bien avec MVC et l'article que je lisais dit à cause de XAML, MVC ne fonctionnerait pas. Ne pas avoir trop d'expérience dans XAML est clairement la raison pour laquelle je n'ai pas eu ce point.

Quelqu'un peut-il expliquer pourquoi MVC n'est pas adapté et pourquoi MVVM est meilleur pour le développement de Silverlight?

Merci JD

44
JD.

C'est une distinction très slim, que je peux expliquer le mieux en comparant MVC dans ASP.NET et MVVM dans WPF.

Dans ASP.NET MVC, la demande est entrée dans le serveur Web et est traitée directement par le contrôleur. Le contrôleur détermine la vue appropriée et la populaire avec des modèles. Le contrôleur libère ensuite ces instances au système sous-jacent qui entraîne un résultat au client. Vous pouvez voir que le contrôleur est d'abord et durer à agir.

Dans MVVM, l'interface utilisateur (la vue) est confrontée à l'utilisateur et prend directement les entrées de l'utilisateur. Dans la vue, les commandes dans la vue de la vue (qui est le DataContext de la vue) sont déclenchées par cette activité. Contrôle des flux vers la fenêtre qui interprète quelle est la vue l'a envoyée et prépare ses modèles. Une fois que le contrôle retourne à la vue, il se met à jour en fonction des modifications des modèles. Si une nouvelle vue est requise, la viewModel communique ceci avec NAVIGATIONSERTERVICE (ou quelle que soit la méthode de navigation de votre application), qui correspond à la vision de la fenêtre ou des composants de la fenêtre ou de l'UI. Vous pouvez voir que la viewmodel n'est pas la première et dure d'agir; La vue joue un rôle beaucoup plus important que chez MVC.

L'architecture de WPF/Silverlight est la raison pour laquelle les choses sont faites de cette façon. Les infrastructures de commande, de liaison et de navigation ne peuvent pas être contrôlées/remplacées par le contrôleur; Ils sont étroitement intégrés à l'interface utilisateur. Le contrôleur doit donc siéger sous la vue et prendre un rôle plus passif.

60
user1228

MVVM a été conçu principalement à cause de XAML et de créer des données encore plus simples, il est très similaire à la MVP. Les principaux avantages sont un moyen plus simple de manipuler l'interface utilisateur (la viewModel ou le présentateur s'occupe de cette tâche plutôt que du modèle ayant à déclencher des événements à la vue après avoir été manipulé par le contrôleur).

Les deux meilleurs articles que j'ai rencontrés qui m'ont aidé à comprendre les principes sont MVC vs mvp vs mvvm et MVVM pour les gens retardés comme moi ou MVVM et ce que cela signifie pour moi

13
Gergely Orosz

Composants de découplage

En MVC, vous avez une relation triangulaire entre les composants. C'est-à-dire: le contrôleur possède la vue et le modèle. La vue s'appuie sur la définition du modèle. Le modèle doit répondre aux exigences de la vue. Pensez à un hub (contrôleur) et à une architecture de rayons (vue et modèle)

En MVVM, pensez que ce triangle aplatit avec chaque composant qui ne connaît que par une autre dans la chaîne. C'est: View-> ViewModel-> Modèle

Le modèle n'est pas au courant de quelque chose de la pile. Le mode de vue n'est conscient que du modèle La vue est consciente uniquement du modèle de vue - il n'est pas au courant du modèle.

Pourquoi est-ce important?

C'est le noyau de la question initiale.

L'objectif principal est une abstraction supplémentaire de votre architecture. Cela conduira généralement à un peu plus de code, mais moins de points de contact entre des objets. Moins de points de contact sont importants car cela conduit à plus de code agile. La classe A plus de couplage/de contact A a avec la classe B, plus un changement de changement de classe A sera. Réduire l'impact du changement est l'un des principaux avantages de la bonne architecture.

Pour bien comprendre cela, il est utile de réfléchir à ce que les composants représentent vraiment. Quelle est une vue, un contrôleur, une vue de vue ou un modèle? Sont-ils des définitions littérales, ou plus d'un concept abstrait?

D'après mon expérience, il a été plus avantageux d'envisager le modèle d'être un groupe de classes/objets qui traitent de la construction et de la persistance des données. Ce n'est pas simplement un objet unique avec des propriétés. C'est une classe qui effectue des attractions de données, des économies de données, une usine qui construit des objets simples. C'est une couche de façade qui fournit une API claire dans les données. Cette couche de façade doit-elle être référencée directement de la vue?

À mon avis, cela ne devrait pas. En MVC, cette réponse est également "non". Le contrôleur récupère les données du modèle. À cet égard, MVC et MVVM atteignent le même objectif. Lorsque les deux architectures diffèrent est la manière dont les données et la vue sont liées.

Comme le modèle, la vue peut être une collection de classes qui en coordination les unes avec les autres, rendant une vue de présentation. Cela pourrait être constitué d'une vue de contrôle + vue dans le cas des plates-formes mobiles (contrôleur d'affichage sur iOS, activité sur Android). Dans de nombreux cas, vous avez besoin d'une classe pour charger un document de vue dans la mémoire et mettre à jour les propriétés de la vue. Il y a beaucoup de travail à faire ici. En MVC, le contrôleur devient rapidement un "lavabo de cuisine", une sorte de dumping motif de décharge pour tout ce qui concerne le contexte de l'utilisateur actuel.

Lorsque vous multipliez cela sur des dizaines de vues potentielles dans votre application, vous vous retrouvez avec beaucoup de profondes dépendances entre votre code de modèle de fin de bord et votre code de vue frontal. Avec de grandes classes de contrôleur, ces dépendances ne sont pas immédiatement apparentes.

Atplatissez vos dépendances

MVVM aplatit les dépendances. Cela crée une concentration. Qu'est-ce qui est la concentration? La capacité de travailler sur une seule fonctionnalité sans la distraction de toutes les autres dépendances. Vous pouvez maintenant commencer à écrire des tests de l'unité sur le code précédemment jugé intensif.

Le modèle de vue agit comme une façade entre la vue et le modèle. Le modèle de vue s'adresse aux besoins de la vue - techniquement, la vue devrait posséder le modèle de vue. Si la vue nécessite des données provenant de sources multiples, le modèle d'affichage encapsule la composition de sources de données distinctes en un seul, unifié, uniforme et désalrialisé. Si la vue doit rappeler dans le modèle ou dans d'autres destinations, le modèle de vue fournit des crochets et des itinéraires l'appel approprié.

Considérez comment fonctionne un panneau de raccordement de réseautage. À première vue, cela semble redondant - pourquoi ne pas simplement câbler votre Ethernet du point A au point B. Mais avec l'expérience, vous comprendrez qu'un panneau de patch vous fournit un élément clé de l'abstraction qui vous permet de modifier les itinéraires du point B sans affectation du point A. C'est ce que fait votre modèle de vue.

Maintenant que vous avez une abstraction propre entre votre point de vue et votre modèle, la conséquence devrait être que votre visualisation/contrôleur ne concerne que la présentation. Cela signifie qu'il ne devrait pas faire face à la localisation ou au formatage - il reçoit des données et présente des données. Votre modèle de vue est un endroit idéal pour mettre ce genre de massage de données pré-voir. Disons que vous devez filtrer les données basées sur un critère. Encore une fois, le modèle de vue est informé des données du modèle (votre vue n'est pas) et est un endroit idéal pour mettre ce genre de code.

Une fois que vous avez commencé à organiser vos exigences de l'application de cette manière, votre code de vue/contrôleur devient plus propre et lorsque quelque chose doit changer, les implications sont plus évidentes, ce qui conduit à moins de bugs.

Testabilité

Une dernière note sur la testabilité: en aplatissant des dépendances, il est plus facile d'injecter des dépendances simulées dans vos tests. Cela facilite les tests et plus concis. Votre modèle de vue devient quelque chose que vous pouvez définir des cas de test clairs contre.

13
Drew Beaupre

Je pense que l'idée est que mvvm est mieux adapté à xaml que mvc. Dire MVC 'n'est pas adapté' est un peu exagéré.

Et pourquoi mvvm est-il meilleur? Principalement en raison de la superbe liaison de données et la liaison de commande dans XAML. Voir Cet article .

4
Henk Holterman

Je pense que l'autre avantage est la courbe d'apprentissage. Comme la plupart des développeurs de Frontend Technologies ont utilisé un type de style de codage MVVM, il est plus facile d'adopter la même chose que d'aller avec un modèle de contrôleur où ils doivent passer à chaque demande de la vue au contrôleur et le faire communiquer avec le modèle.

4
Neha Khanna