Model-View-Controller: L'utilisateur interagit-il avec la vue ou avec le contrôleur? [fermé]

14

J'ai récemment découvert le modèle de conception MVC. J'apprends du livre Head First Design Pattern.

Selon ce livre (si je comprends bien):

Le modèle est la plupart de la logique d'application et des données.

La vue est essentiellement l'interface graphique qui représente visuellement le modèle pour l'utilisateur.

Le contrôleur est responsable de la «médiation» et agit comme un «intermédiaire» entre la vue et le modèle. La vue signale au contrôleur que l'utilisateur a effectué une action et le contrôleur la traduit en appels de méthode sur le modèle.

Cependant, beaucoup d'endroits sur le Web contredisent ce que je comprends de ce livre. Ils affirment que généralement l'utilisateur interagit avec le contrôleur, pas avec la vue.

Laquelle est vraie ou plus courante? L'utilisateur interagit-il directement avec le contrôleur ou directement avec la vue? Les deux approches sont-elles acceptables? Quel est le plus courant?

Aviv Cohn
la source
4
Cette question ne répond pas de façon significative à la façon dont vous l'avez écrite. Donnez-nous un exemple de l'un des endroits sur le Web qui contredit le livre, et nous essaierons de l'expliquer. Soyez précis avec votre exemple.
Robert Harvey
1
2 réponses, toutes deux votées, l'une dit "interagir avec la vue" l'autre dit "interagir avec le contrôleur" .... me fait penser que MVC n'est pas une assez bonne architecture si elle est confuse à un niveau aussi fondamental!
gbjbaanb
Cliquez-vous sur les contrôles de l'application ou sur les requêtes de base de données? L'interaction se fait directement avec l'interface utilisateur, qui est elle-même une vue. La vue invoque généralement des requêtes vers le serveur (dans le cas d'applications Web) ou appelle les hooks enregistrés sur celles-ci (dans le cas d'applications client). A côté de cela, l'ensemble du MVC est juste de la merde.
luke1985
@spectre Il n'est pas utile de rejeter MVC sans fournir une explication et, idéalement, une alternative. Sinon, ce licenciement n'apporte rien et aurait dû être laissé de côté. D'ailleurs, même avec ça, ce serait toujours hors sujet.
underscore_d

Réponses:

18

L'utilisateur interagit avec la vue , mais la vue doit communiquer les actions au contrôleur . Le contrôleur peut mettre à jour le modèle , mais cela n'est pas requis à chaque changement.

La description que je fournis est basée sur mon expérience personnelle avec l'implémentation .NET de MVC. Votre implémentation peut être différente.

Le contrôleur est l'endroit où les actions sont traitées, essentiellement une couche métier. Un simple contrôleur ne fera rien de plus que d'obtenir les données du modèle pour les alimenter dans la vue. Un contrôleur compliqué effectuera toutes sortes d'actions, jusqu'à la gestion de la sécurité, l'authentification, l'autorisation, l'enregistrement et peut-être bien d'autres choses.

La vue ne doit être responsable que de l'affichage des informations d'une manière que l'utilisateur peut comprendre. Il peut y avoir un croisement ici avec le contrôleur et le modèle car des choses comme les applications à page unique (SPA) auront des commentaires de validation des données pour l'utilisateur. Tout autre croisement est fortement mal vu.

Le modèle traite des données. Cela comprend la validation des données (le cas échéant). Le stockage et la récupération des données sont également gérés dans cette couche.


MISE À JOUR

Il semble y avoir une certaine confusion autour de qui fait quoi et quand. J'ai inclus deux aperçus différents des architectures MVC car elles sont similaires, mais pas identiques. Il y a place pour l'une ou l'autre interprétation. Peut-être beaucoup plus. Les descriptions ci-dessus sont mon interprétation de MVC à partir de plusieurs sources, y compris ma propre expérience dans la création d'applications utilisant cette méthodologie. Espérons que cette mise à jour contribuera à dissiper une partie de cette confusion.

MVC est une tentative de construire un modèle de conception de séparation des préoccupations pour le développement de logiciels. Il a été principalement implémenté dans des applications Web (à ma connaissance).

La vue gère toutes les interactions de l'utilisateur. Si votre utilisateur clique sur un bouton, la vue détermine si le clic est une interaction de l'interface utilisateur ou quelque chose qui est au-delà de sa préoccupation (une interaction du contrôleur). Si le bouton fait quelque chose comme copier des valeurs d'un champ à un autre, votre implémentation déterminera s'il s'agit d'un problème de vue ou d'un problème de contrôleur. Vous n'aurez probablement ce flou de préoccupations que lorsqu'il s'agit d'une application de page unique (SPA).

Le contrôleur est l'endroit où vos actions sont traitées. La vue a communiqué que l'utilisateur a décidé de modifier les valeurs de certains champs. Le contrôleur peut effectuer la validation de ces données ou elles peuvent être traitées par le modèle. Encore une fois, cela dépend de la mise en œuvre. Si le contrôleur possède des fonctions de sécurité, il peut déterminer que l'utilisateur ne dispose pas de privilèges suffisants pour effectuer l'action. Il rejetterait les modifications et mettrait à jour la vue en conséquence. Le contrôleur détermine également les données à récupérer du modèle, comment les empaqueter et mettre à jour la vue avec ces données.

Le modèle détermine comment et où stocker les données. Il peut également effectuer la validation de ces données avant de les stocker (il devrait le faire car les gens contourneront la vue à l'occasion).


Wikipedia a un article sur MVC .

  • Un modèle notifie sa ou ses vues et contrôleurs associés en cas de changement d'état. Cette notification permet aux vues de mettre à jour leur présentation et aux contrôleurs de modifier l'ensemble de commandes disponible. Dans certains cas, une implémentation MVC peut plutôt être «passive», de sorte que d'autres composants doivent interroger le modèle pour les mises à jour plutôt que d'être notifiés.
  • Une vue est donnée par le contrôleur toutes les informations dont il a besoin pour générer une représentation de sortie pour l'utilisateur. Il peut également fournir des mécanismes génériques pour informer le contrôleur des entrées utilisateur.
  • Un contrôleur peut envoyer des commandes au modèle pour mettre à jour l'état du modèle (par exemple, modifier un document). Il peut également envoyer des commandes à sa vue associée pour modifier la présentation de la vue du modèle (par exemple, en faisant défiler un document).

Extrait de la présentation de Microsoft sur MVC .

  • Des modèles. Les objets de modèle sont les parties de l'application qui implémentent la logique du domaine de données de l'application. Souvent, les objets de modèle récupèrent et stockent l'état du modèle dans une base de données. Par exemple, un objet Product peut récupérer des informations dans une base de données, y opérer, puis réécrire les informations mises à jour dans une table Products dans une base de données SQL Server.

    Dans les petites applications, le modèle est souvent une séparation conceptuelle au lieu d'une séparation physique. Par exemple, si l'application lit uniquement un ensemble de données et l'envoie à la vue, l'application n'a pas de couche de modèle physique et de classes associées. Dans ce cas, l'ensemble de données joue le rôle d'un objet modèle.

  • Vues. Les vues sont les composants qui affichent l'interface utilisateur (UI) de l'application. En général, cette interface utilisateur est créée à partir des données du modèle. Un exemple serait une vue d'édition d'une table Produits qui affiche des zones de texte, des listes déroulantes et des cases à cocher en fonction de l'état actuel d'un objet Produit.

  • Contrôleurs. Les contrôleurs sont les composants qui gèrent l'interaction utilisateur, travaillent avec le modèle et sélectionnent finalement une vue à rendre qui affiche l'interface utilisateur. Dans une application MVC, la vue affiche uniquement des informations; le contrôleur gère et réagit à l'entrée et à l'interaction de l'utilisateur. Par exemple, le contrôleur gère les valeurs de chaîne de requête et transmet ces valeurs au modèle, qui à son tour peut utiliser ces valeurs pour interroger la base de données.

Adam Zuckerman
la source
Et si vous n'avez pas d'interface graphique pour toutes les actions? Et si vous n'avez implémenté que l'API pour certaines parties spécifiques? Cela signifie-t-il que l'utilisateur interagit parfois avec la vue et parfois directement avec le contrôleur?
Mahdi
1
De mon point de vue, non. L'API remplace la vue.
Adam Zuckerman
mais l'API pourrait être un simple url-routes, placé dans le Controller. Je veux dire pas de vue du tout ...
Mahdi
1
@AdamZuckerman Merci d'avoir répondu. Dans le commentaire suivant, je vais décrire comment je pense qu'une implémentation MVC commune fonctionne, veuillez confirmer si elle est correcte ou non. Merci
Aviv Cohn
2
@Mahdi Une API, par définition, est là comme une interface de programmation , pas une interface utilisateur . Les programmes interagissent avec l'API, les utilisateurs interagissent avec la vue.
Eric King
4

L'utilisateur interagit avec le contrôleur . Du point de vue technique , vous n'êtes pas en interaction avec le View , vous êtes juste en utilisant pour interagir avec le contrôleur .

En surface, il semble que l'utilisateur interagisse avec l'interface graphique - également pour un non-programmeur, cela a plus de sens, mais en cliquant sur un bouton, vous parlez essentiellement au contrôleur et non à la vue .

De plus, toutes les applications - même les applications Web MVC, n'ont pas d'interface graphique. Vous pouvez interagir avec le contrôleur via une API - simple url-routespar exemple, placée dans le contrôleur lui-même.

Le contrôleur doit être l'endroit qui reçoit et traite les demandes des utilisateurs. Donc, si vous accédez en quelque sorte au modèle directement à partir de View - peu importe comment, alors ce n'est plus MVC .

Mahdi
la source
2
+1 C'est correct. Des choses comme les menus et les barres d'outils font partie de l'interface graphique mais pas de la vue, et vont directement au contrôleur. Les frappes de même.
david.pfx
1
La raison pour laquelle les vues existent en tant qu'abstraction est que nous pouvons les remplacer facilement si nécessaire. Un contrôleur pour une application sur différentes plates-formes peut être le même, mais les vues doivent reconnaître les gestes de l'utilisateur différemment et les traduire en opérations de contrôleur. Je ne suis donc pas d'accord pour dire que les utilisateurs interagissent directement avec les contrôleurs.
Fuhrmanator
1
@Mahdi Je dirais que dans ce cas, il n'y a aucune interaction avec l'utilisateur, c'est la vue communiquant par programmation avec le contrôleur. Les seules interactions initiées par l' utilisateur se font via la vue.
Eric King
1
@ david.pfx Les frappes ne peuvent pas passer directement d'une fenêtre de navigateur à un contrôleur.
Adam Zuckerman
1
@Izkata "La vue est la partie du code à laquelle les demandes sont envoyées" - Désolé, mais c'est la pire chose que j'ai entendue ici. Comment est-ce possible? Pouvez-vous le sauvegarder en fournissant une référence dans un article ou un livre?
Mahdi
1

Prenons un exemple concret de la raison pour laquelle les utilisateurs interagissent directement avec les vues et non avec les contrôleurs.

Dans l'application musicale sur iPhone, une fonction de haut niveau consiste à lire une liste de lecture. "Lire une liste de lecture" est une fonction d'un contrôleur de l'application.

Il existe plusieurs façons d'activer cette fonction. Je peux cliquer sur la liste de lecture à l'intérieur de l'application, ou je peux demander à Siri (interface vocale) d'exécuter la même fonction. Ce sont deux gestes différents qui sont reconnus par les différentes vues.

Les commentaires dans chaque vue sont également différents. Siri vous dira qu'il joue la musique que vous avez demandée. L'application musicale vous montrera un retour visuel indiquant qu'elle joue la liste de lecture.

Fuhrmanator
la source