Quelles sont les améliorations de MVP par rapport à MVC?

49

J'ai lu pendant trois jours sur les modèles Model-View-Controller (MVC) et Model-View-Presenter (MVP) . Et il y a une question qui me dérange beaucoup. Pourquoi les concepteurs de logiciels ont-ils inventé MVP, alors qu'il y avait déjà un MVC?

Quels problèmes ont-ils rencontrés, que MVC n'a pas résolus (ou mal résolus), mais que MVP peut résoudre? Quels problèmes MVP est-il censé résoudre?

J'ai lu de nombreux articles sur l'historique et l'explication de MVP, ou sur les différences entre MVC et MVP, mais aucun d'entre eux n'avait de réponse claire à mes questions.

Dans l'un des articles que j'ai lus, il était dit:

Passons maintenant à Model View Presenter, qui répondait aux insuffisances du motif MVC appliqué aux interfaces utilisateur graphiques modernes à base de composants. Dans les systèmes d'interface graphique modernes, les composants d'interface graphique traitent eux-mêmes les entrées de l'utilisateur, telles que les mouvements de la souris et les clics, plutôt que celles d'un contrôleur central.

Donc, je ne peux pas comprendre, mais peut-il en réalité être autrement, de telle sorte que les composants de l'interface graphique ne gèrent pas les entrées de l'utilisateur par eux-mêmes? Et que veut dire exactement "manipuler par eux-mêmes"?

Victor
la source
4
Duplicate of stackoverflow.com/questions/2056/…
qwerty_so
4
Je pense que c'est juste "Les nouveaux vêtements de l'empereur", un nouveau mot à la mode de Mickeysoft.
qwerty_so
4
Victor, avez-vous une question précise autre que "pourquoi y a-t-il deux modèles différents?" Il existe deux modèles différents car ils résolvent le même problème de deux manières légèrement différentes. Si cela peut aider, le modèle et la vue sont essentiellement les mêmes dans les deux modèles. Concentrez-vous sur les différences entre un contrôleur et un présentateur. Vous pouvez trouver plus d'aide ici: linkedin.com/pulse/…
Robert Harvey
18
"J'ai lu pendant trois jours sur les modèles MVC et MVP." Beurk. Je vous suggère d'aller prendre un bain chaud relaxant ou de sauter des pierres sur un étang rempli de canards ou quelque chose du genre. Ce genre de lecture peut, en l’absence de toute application pratique, vraiment fondre votre cerveau!
user1172763
11
Pour obtenir le type de réponse que vous souhaitez, vous devez construire quelque chose en utilisant ces modèles. Ensuite, vous serez éclairés.
Robert Harvey

Réponses:

63

MVC est conceptuellement élégant:

  • la saisie de l'utilisateur est gérée par le contrôleur
  • le contrôleur met à jour le modèle
  • le modèle met à jour la vue / l'interface utilisateur
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

Cependant: Le flux de données et d'événements dans MVC est circulaire. Et la vue contiendra souvent une logique importante (comme des gestionnaires d’événements pour les actions de l’utilisateur). Ensemble, ces propriétés rendent le système difficile à tester et à maintenir.

L'architecture MVP remplace le contrôleur par un présentateur, qui sert d'intermédiaire entre la vue et le modèle. Ceci linéarise le système:

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

Cela présente les avantages suivants:

  • La logique (comme les gestionnaires d'événements et l'état de l'interface utilisateur) peut être déplacée de la vue vers le présentateur.

  • L'interface utilisateur peut être testée par unité en termes de présentateur, car elle décrit l'état de l'interface utilisateur. Dans le test unitaire, nous remplaçons la vue par un pilote de test qui appelle le présentateur.

  • L'interface utilisateur étant isolée de la logique de l'application, les deux peuvent être développés indépendamment.

Mais cette approche présente également des inconvénients:

  • Cela demande plus d'effort.
  • Le présentateur peut facilement se transformer en une «classe de dieu» impossible à maintenir.
  • L'application n'a pas un seul axe MVP, mais plusieurs axes: un pour chaque écran / fenêtre / panneau de l'interface utilisateur. Cela peut simplifier votre architecture ou la compliquer terriblement.
Amon
la source
7
Bonne réponse, mais le MVC moderne n'utilise généralement pas beaucoup (le cas échéant) de gestionnaires d'événements, à l'exception peut-être de la validation de formulaire local, et je ne considère pas ces événements comme faisant partie de MVC proprement dit. C'est pourquoi nous avons MVP et MVVM. MVC est essentiellement côté serveur.
Robert Harvey
@ amon, merci pour votre réponse, cela me dit beaucoup de choses. Et vous mentionnez qu'avoir plusieurs axes en application peut simplifier l'architecture. Je rencontre cette idée dans de nombreux journaux et il a été mentionné comme l'une des principales raisons d'inventer MVP, car MVC ne correspond pas aux exigences des interfaces graphiques complexes. C'est-à-dire, quelles exigences MVP correspondent et comment il résout ces exigences? Désolé d'être si persistant, mais je cherche vraiment à bien le comprendre.
Victor
4
@Victor Il n'y a pas de meilleur modèle, mais les compromis sont différents. MVC peut correspondre à des exigences complexes. En termes d’architecture, MVP impose une relation 1: 1 entre les vues et les présentateurs: chaque vue a son propre présentateur, chaque présentateur étant connecté à une vue. Dans MVC, il existe une relation n: m: une vue peut envoyer des entrées utilisateur à plusieurs contrôleurs différents, et un contrôleur peut recevoir des entrées de plusieurs vues. C’est plus flexible, mais aussi plus chaotique: il n’ya pas d’axe clair dans MVC.
amon
1
@Victor Je n'ai pas beaucoup d'expérience avec les interfaces graphiques, alors il y a probablement beaucoup de choses que je n'ai pas mentionnées. La dernière interface graphique que j'ai créée était un véritable gâchis, car je ne connaissais pas encore MVP: un flux de données et de contrôle linéarisé aurait constitué une énorme amélioration.
am
9
@ RobertHarvey Je dirais que ce que le Web appelle "MVC" n'a jamais été vraiment "MVC" au sens de la définition d'origine. Quiconque a détourné l'acronyme devrait être frappé à la tête pour avoir choisi un terme chargé et déroutant tout le monde.
JPMc26
6

Dans MVP, le présentateur remplace le contrôleur de MVC. La différence entre les deux est que le présentateur manipule directement la vue. Il est conçu pour les infrastructures d'interface utilisateur principalement événementielles (telles que Windows Forms), sans prise en charge importante de la liaison de données enrichies pouvant servir au modèle MVVM (comme WPF). Sinon, une grande partie de la logique de gestion de l'état de la vue et de la mise à jour du modèle de sauvegarde se trouverait dans la vue elle-même.

Michael Brown
la source