194 votes

Qu'est-ce qui entre dans le "Controller" dans "MVC"?

Je pense comprendre les concepts de base de la MVC - le Modèle contient les données et le comportement de l'application, la Vue est responsable de l'affichage à l'utilisateur et le Contrôleur traite de la saisie de l'utilisateur. Ce que je suis incertain sur est exactement ce qui se passe dans le Contrôleur.

Disons par exemple j'ai un assez simple demande (je suis pensons en particulier à Java, mais je suppose que les mêmes principes s'appliquent d'ailleurs). - Je organiser mon code en 3 paquets appelés app.model, app.view et app.controller.

Au sein de l' app.model paquet, j'ai un peu de classes qui reflètent le comportement réel de l'application. Ces extends Observable et l'utilisation setChanged() et notifyObservers() pour déclencher la vue de mettre à jour le cas échéant.

L' app.view paquet dispose d'une classe ou de plusieurs classes pour les différents types d'affichage) qui utilise javax.swing composants pour gérer l'affichage. Certains de ces éléments sont nécessaires pour alimenter le Modèle. Si je comprends bien, la Vue ne devrait pas avoir quelque chose à voir avec les commentaires - qui devrait être traitée par le Contrôleur.

Alors, que dois-je effectivement mis dans le Contrôleur? Dois-je mettre la public void actionPerformed(ActionEvent e) dans la Vue avec juste un appel à une méthode du Contrôleur? Si oui, de validation, etc être fait dans le Contrôleur? Si oui, comment dois-je rétroaction des messages d'erreur de la Vue - où aller grâce à ce Modèle de nouveau, ou si le Contrôleur suffit de l'envoyer tout droit de revenir à l'Affichage?

Si la validation est faite dans la Vue, que dois-je mettre dans le Contrôleur?

Désolé pour la longue question, je voulais juste de documenter ma compréhension du processus et nous espérons que quelqu'un peut répondre à cette question pour moi!

556voto

Andres Jaan Tack Points 9929

Dans l'exemple que vous avez suggéré, vous avez raison: "l'utilisateur a cliqué sur" supprimer cet élément "bouton" dans l'interface doit fondamentalement, il suffit d'appeler le contrôleur de la fonction "supprimer". Le contrôleur, cependant, n'a aucune idée de ce que la vue ressemble, et donc, votre point de vue doit recueillir certaines informations telles que, "l'élément sur lequel l'utilisateur a cliqué?"

Dans une conversation forme:

Vue: "Hé, contrôleur, il suffit à l'utilisateur m'a dit qu'il veut le point 4 est supprimé."
Contrôleur: "Hmm, après avoir vérifié ses informations d'identification, il est autorisé à le faire... Hé, modèle, je veux que vous obtenez le point 4 et de faire tout ce que vous faire pour le supprimer."
Modèle: "l'Article 4... il est devenu. Il est supprimé. De retour à vous, Contrôleur."
Contrôleur: "Ici, je vais récupérer le nouveau jeu de données. De retour à vous, la vue."
Vue: "Cool, je vais vous montrer le nouveau jeu de l'utilisateur."

À la fin de cette section, vous disposez d'une option: soit le point de vue peut faire une demande distincte, "donnez-moi la plus récente de l'ensemble de données", et donc d'être plus pure, ou le contrôleur renvoie implicitement le nouveau jeu de données avec le "supprimer".

72voto

Bert F Points 27237

Le problème avec MVC , c'est que les gens pensent de la vue, le contrôleur et le modèle doivent être aussi indépendants que possible les uns des autres. Ils ne sont pas d'un point de vue et le contrôleur sont souvent entremêlées - il pense que M(VC).

Le contrôleur est le mécanisme d'entrée de l'interface utilisateur, qui est souvent empêtré dans la vue, en particulier avec les Interfaces graphiques. Néanmoins, la vue est sortie et est un contrôleur d'entrée. Une vue peut souvent fonctionner sans un contrôleur correspondant, mais un contrôleur est généralement beaucoup moins utile, sans vue. Utilisateur conviviale de l'utilisation de contrôleurs de la vue d'interpréter l'entrée de l'utilisateur dans un plus significatives, intuitive de la mode. C'est ce que c'est difficile de séparer le concept de contrôleur de la vue.

Pensez à un radio-pilotée robot sur un champ de détection dans une boîte scellée comme le modèle.

Le modèle est tout au sujet de l'état et des transitions d'état avec pas de concept de sortie (affichage) ou ce qui est le déclenchement de la transition de l'état. Je peux obtenir la position du robot sur le terrain et le robot sait, la transition de la position (prendre un pas en avant/arrière/gauche/droite. Facile à imaginer, sans vue ou d'un contrôleur, mais ne fait rien d'utile

Pense que d'un point de vue, sans un contrôleur, par exemple, quelqu'un dans une autre pièce sur le réseau dans une autre salle, en regardant la position du robot (x,y) les coordonnées de streaming un défilement vers le bas de la console. Ce point de vue est juste de l'affichage de l'état du modèle, mais ce gars n'a pas de contrôleur. Encore une fois, facile à imaginer ce point de vue, sans un contrôleur.

Pensez à un contrôleur sans vue, par exemple, quelqu'un enfermé dans un placard avec la radio contrôleur à l'écoute pour le robot de la fréquence. Ce contrôleur est l'envoi d'entrée et de causer des transitions d'état avec aucune idée de ce qu'ils font pour le modèle (le cas échéant). Facile à imaginer, mais pas vraiment utile sans une sorte de rétroaction à partir de la vue.

La plupart d'utilisateur-INTERFACE utilisateur conviviale de coordonnées de la vue avec le contrôleur à fournir une interface utilisateur plus intuitive. Par exemple, imaginez une vue/contrôleur avec un écran tactile montrant le robot de la position actuelle en 2-D et permet à l'utilisateur de toucher le point sur l'écran qui se trouve tout juste à l'avant du robot. Le contrôleur de détails sur la vue, par exemple, la position et l'échelle de la fenêtre d'affichage et la position d'un pixel de l'endroit touché par rapport à la position d'un pixel du robot sur l'écran) pour interpréter correctement (contrairement au mec enfermé dans le placard avec la radio, le contrôleur).

Ai-je répondu à votre question? :-)

Le contrôleur est quelque chose qui prend une entrée de l'utilisateur qui est utilisé pour le modèle de transition de l'état. Essayez de garder la vue et le contrôleur a séparés, mais se rendent compte qu'ils sont souvent interdépendants les uns des autres, de sorte qu'il est correct si la frontière entre eux est floue, c'est à dire avoir la vue et le contrôleur de séparer les paquets peuvent ne pas être clairement séparées comme vous voulez, mais c'est correct. Vous pourriez avoir à accepter le contrôleur ne pas être clairement séparées de la vue que la vue est à partir du modèle.

... de validation, etc fait dans le Contrôleur? Si oui, comment faire Je rétroaction des messages d'erreur de retour à l' De vue, qui devrait passer par la Modèle de nouveau, ou si le Contrôleur tout simplement l'envoyer tout droit de revenir à l'Affichage?

Si la validation est faite dans la Vue, que dois-je mettre dans le Contrôleur?

Je dis lié vue et le contrôleur doit interagir librement sans passer par le modèle. Le contrôleur de prendre l'entrée de l'utilisateur et doit procéder à la validation (peut-être en utilisant des informations du modèle et/ou de la vue), mais si la validation échoue, le contrôleur doit être en mesure de mettre à jour ses vues liées directement (par exemple, message d'erreur).

Le test de l'acide pour cela est de se poser est de savoir si d'un point de vue indépendant (c'est à dire le gars dans l'autre chambre, en regardant la position du robot via le réseau) doit voir quoi que ce soit ou non comme un résultat de quelqu'un d'autre erreur de validation (par exemple, le gars dans le placard essayé de dire le robot à l'étape hors du terrain). Généralement, la réponse est non - l'erreur de validation empêché la transition de l'état. Si il n'y avait pas d'état au tranistion (le robot ne bouge pas), il n'est pas besoin de dire aux autres points de vue. Le gars dans le placard juste ne pas obtenir des commentaires qu'il a essayé de provoquer une transition illégale (sans vue - mauvaise interface utilisateur), et personne ne doit le savoir.

Si le gars avec l'écran tactile essayé d'envoyer le robot hors du terrain, il a eu une belle convivial message vous demandant de ne pas tuer le robot en l'envoyant hors de la zone de détection, mais encore une fois, personne ne doit le savoir.

Si d'autres points de vue ne devez savoir à propos de ces erreurs, alors vous êtes effectivement dire que les entrées de l'utilisateur et les erreurs sont une partie du modèle et de toute la chose est un peu plus compliqué ...

24voto

JP Alioto Points 33482

Voici un bon article (lien mort comme de 2014-04-03) sur les bases de la MVC. Il indique ...

Contrôleur: Le contrôleur se traduit par les interactions avec la vue sur actions à effectuer par le modèle.

En d'autres termes, votre logique métier. Le contrôleur répond à des actions par l'utilisateur, prendre le dans la vue et répond. Vous mettez de validation ici et sélectionnez la vue, si la validation échoue ou réussit (page d'erreur, boîte de message, peu importe).

Il est un autre bon article à Fowler.

24voto

Dimitri C. Points 6455

Le modèle MVC veut simplement vous séparer la présentation (= vue) de la logique buisiness (= modèle). La partie contrôleur est-il seulement de prêter à confusion.

9voto

BlairHippo Points 2849

Basé sur votre question, j'ai l'impression que vous êtes un peu flou sur le rôle du Modèle. Le Modèle est fixé sur les données associées à l'application; si l'application dispose d'une base de données, le Modèle de l'emploi sera de parler. Il permettra également de gérer n'importe quel simple logique associées à ces données; si vous avez une règle qui dit que pour tous les cas où la TABLE.foo == "Hourra!" et de la TABLE.bar == "Huzzah!" alors, TABLE de jeu.champ="W00t!", alors vous voulez que le Modèle pour prendre soin d'elle.

Le Contrôleur est ce qui devrait être la manipulation de la majeure partie du comportement de l'application. Donc, pour répondre à vos questions:

"Dois-je mettre le public void actionPerformed(ActionEvent e) dans la Vue avec juste un appel à une méthode du Contrôleur?"

Je dirais que non. Je dirais que dans le Contrôleur de la Vue doit simplement fournir les données en provenance de l'interface utilisateur dans le Contrôleur, et de laisser le Contrôleur de décider des méthodes devrait être appelée en réponse.

"Si donc, en cas de validation, etc être fait dans le Contrôleur?"

La majeure partie de votre validation de vraiment devrait être fait par le Contrôleur; il doit répondre à la question de savoir si les données sont valides, et si elle n'est pas, de nourrir les messages d'erreur appropriés à la Vue. Dans la pratique, vous pouvez incorporer quelques simples contrôles d'intégrité dans la couche de la Vue pour le bien de l'amélioration de l'expérience utilisateur. (Je pense principalement des environnements web, où vous pouvez avoir un message d'erreur pop-up du moment où l'utilisateur appuie sur "Soumettre", plutôt que d'attendre la fin de la soumettre -> processus -> load cycle de la page avant de leur dire ils ont foiré.) Juste être prudent; vous ne voulez pas dupliquer les efforts, pas plus que vous avez, et dans beaucoup d'environnements (encore une fois, je pense que je vais le web), vous avez souvent à traiter les données en provenance de l'interface utilisateur comme un paquet de sales sales mensonges jusqu'à ce que vous avez confirmé que c'est en fait légitime.

"Si oui, comment dois-je rétroaction des messages d'erreur de la Vue - où aller grâce à ce Modèle de nouveau, ou si le Contrôleur suffit de l'envoyer directement vers l'arrière pour voir?"

Vous devriez avoir un certain protocole mis en place où la Vue n'est pas nécessairement au courant de ce qui se passe ensuite jusqu'à ce que le Contrôleur dit-il. Ce que l'écran ne vous les montrer après que l'utilisateur tappe ce bouton? La Vue peut ne pas savoir, et le Contrôleur ne le savent pas, soit jusqu'à ce qu'il regarde les données, il est maintenant. Il peut être "Aller à l'autre de l'écran, comme prévu" ou "Rester sur cet écran et afficher de message d'erreur".

Dans mon expérience, la communication directe entre le Modèle et la Vue doit être très, très limité, et la Vue ne doit pas modifier directement les de données du Modèle; ce qui devrait être le Contrôleur du travail.

"Si la validation est faite dans la Vue, que dois-je mettre dans le Contrôleur?"

Voir ci-dessus; la véritable validation doit être dans le Contrôleur. Et j'espère que vous avez une idée de ce qui devrait être mis dans le Contrôleur. :-)

Il est intéressant de noter que cela peut devenir un peu floue sur les bords; comme avec la plupart des quelque chose d'aussi complexe que le génie logiciel, les appels de jugement abonderont. Il suffit d'utiliser votre meilleur jugement, essayez de rester cohérent au sein de cette application, et essayez d'appliquer les leçons que vous apprenez dans le prochain projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X