web-dev-qa-db-fra.com

Pourquoi MVVM et quels sont ses principaux avantages?

Pourquoi nous optons pour MVVM sur MVC ou MVP tout en traitant avec WPF?

Quel avantage supplémentaire nous obtenons en l'utilisant?

Éditer:

Pour être honnête, j'ai eu aujourd'hui une interview et on m'a posé cette question. J'ai répondu comme INotifyPropertyChanged, ICommand, IValue Convertor .. mais il n'était pas satisfait. Désormais j'ai posé cette question

Merci d'avance

38
priyanka.sarkar

Je vais vous signaler un video particulièrement utile de Jason Dolinger.

Venant d'un monde WinForms, la mise en œuvre de n'importe quel modèle de style MVX semblait plus compliquée qu'elle n'en valait la peine, mais après avoir travaillé avec WPF pendant quelques années maintenant, je peux honnêtement dire que je n'envisagerais rien de moins. L'ensemble du paradigme est pris en charge dès le départ.

Tout d'abord, le principal avantage est de permettre une véritable séparation entre view et model. En termes réels, cela signifie que si/quand votre modèle doit changer, il peut le faire sans que la vue en ait besoin et vice-versa.

Deuxièmement, bien que votre model puisse contenir toutes les données dont vous pourriez avoir besoin dans votre view, vous souhaiterez peut-être résumer ces données de telle manière que votre model ne prend pas en charge . Par exemple, supposons que votre modèle contienne une propriété date. Dans le modèle, il peut exister uniquement en tant qu'objet DateTime mais votre vue peut vouloir le présenter d'une manière complètement différente. Sans le viewmodel, vous devrez soit dupliquer la propriété dans le model pour prendre en charge la vue, soit modifier la propriété qui pourrait sérieusement obscurcir le "modèle".

Vous pouvez également utiliser un viewmodel pour agréger des parties de votre modèle qui existent dans des classes/bibliothèques distinctes afin de faciliter une interface plus fluide pour le view. Il est très peu probable que vous souhaitiez travailler avec les données de votre code de la même manière qu'un utilisateur voudra ou voudra que les données soient présentées à leur.

En plus de cela, vous obtenez la prise en charge de la liaison de données bidirectionnelle automatique entre view et viewmodel.

Il y a vraiment tout un tas de trucs supplémentaires sur lesquels je pourrais m'adresser mais Jason le dit bien mieux que je pourrais donc mon conseil est de regarder la vidéo. Après quelques jours de travail comme celui-ci, vous vous demanderez comment vous avez pu vous en passer.

Bonne chance.

48
EightyOne Unite

Ce sont les miens spécifiques à MVVM

  1. Augmente la "fusionnabilité" de vos vues (possibilité d'utiliser Expression Blend pour concevoir des vues). Cela permet une séparation des responsabilités sur des équipes qui ont la chance d'avoir un designer et un programmeur ... chacun peut travailler indépendamment l'un de l'autre.
  2. Logique de vue "Lookless". Les vues sont indépendantes du code qui les exécute, permettant à la même logique de vue d'être réutilisée sur plusieurs vues ou d'avoir une vue facilement réoutillée ou remplacée. Séparer les inquiétudes entre "comportement" et "style".
  3. Pas de code dupliqué pour mettre à jour les vues. Dans le code-behind, vous verrez beaucoup d'appels à "myLabel.Text = newValue" dispersés partout. Avec MVVM, vous pouvez être assuré que la vue est mise à jour de manière appropriée simplement en définissant la propriété sous-jacente et tous ses effets secondaires.
  4. testabilité. Puisque votre logique est complètement indépendante de votre vue (pas de références "myLabel.Text"), le test unitaire est facilité. Vous pouvez tester le comportement d'un ViewModel sans impliquer sa vue. Cela a également permis le développement piloté par les tests du comportement de la vue, ce qui est presque impossible en utilisant le code-behind.

Les deux autres schémas sont en quelque sorte séparés en termes de préoccupations qu'ils abordent. Vous pouvez utiliser MVVM avec MVP et MVC (la plupart des bons échantillons existent en quelque sorte).

En fait, MVP (avec une vue passive, plutôt qu'un contrôleur de supervision) n'est vraiment qu'une variante de MVVM, à mon avis.

18
Anderson Imes

WPF a une meilleure liaison de données que tout autre cadre d'interface utilisateur, dont MVVM serait indiscipliné sans

MVVM offre une testabilité unitaire et un excellent agnostic de vue, ce qui en fait une bonne chose à utiliser

5
Rob Fonseca-Ensor

La prise en charge de ICommand et INotifyPropertyChanged sont les deux principaux avantages. L'utilisation de MVVM facilite le câblage des commandes et la connexion des données à l'interface utilisateur WPF. Les choses fonctionnent.

3
Jeremy Roberts

Personnellement, je considère MVVM non pas comme un avantage, mais comme une obligation pour ceux qui souhaitent utiliser les fonctionnalités intéressantes de WPF.

WPF est très très fortement construit avec la liaison de données au cœur, pour permettre la séparation de l'interface utilisateur du modèle. Mais la façon dont la liaison de données est techniquement effectuée dans WPF est quelque peu spéciale, car elle est liée à des classes comme:

  • DependencyProperty
  • INotifyPropertyChanged
  • ObservableCollection

Pour cette raison, vous ne pouvez pas vraiment écrire un modèle comme vous le souhaitez en utilisant la technologie .NET standard. Par exemple, WPF TreeView est presque impossible à utiliser sans utiliser de liaison de données et de modèles. Vous ne pouvez simplement pas le remplir comme vous le feriez à partir d'un modèle générique dans Winforms par exemple. Il doit être lié à un modèle hiérarchique utilisant ObservableCollection pour représenter les enfants d'un nœud.

Supposons donc que V représente le code XAML et son homologue codé (donc il est lié à WPF en tant que technologie), et disons que M représente votre modèle (il n'est donc pas lié à la technologie WPF UI de toute façon).

Eh bien, cela ne fonctionnera jamais correctement sous WPF avec seulement ces V & M.

Vous devez ajouter quelque chose entre les deux. Quelque chose qui est compatible WPF et qui comprend votre modèle. Quelque chose qui parle DependencyProperty, ObservableCollection et INotifyPropertyChanged. C'est ce qu'on appelle VM.

En guise de remarque, une alternative à MVVM consiste à créer une combinaison V & M (w/o VM plumbing) avec M compatible WPF mais toujours avec une indépendance d'interface utilisateur raisonnable. Historiquement, ObservableCollection se trouvait dans l'assembly WindowsBase.dll (fourni avec WPF), il était donc vraiment étrange de lier un modèle générique à quelque chose lié à une technologie d'interface utilisateur. Il a été replacé dans System.dll depuis. Même dans ce cas, il est parfois difficile garder un pur VM sans peaufiner le M spécifiquement pour WPF ...

1
Simon Mourier

La capacité du code XAML à se lier à des données, ainsi que l'existence de déclencheurs briseront les modèles MVP et MVC.

0
danidl