2010-09-14 3 views
1

J'ai une question concernant la conception de MVC, basée sur les conférences de Stanford iPhone.MVC question de la meilleure pratique

J'ai 3 classes;

Polygone - ceci contient des informations comme le nombre de côtés et ainsi de suite. Ceci est ma classe Model

Controller - cela répond à des choses comme appuyer sur des boutons dans la vue et calles ensuite des méthodes dans le modèle pour augmenter et diminuer le nombre de côtés, etc. Ceci est mon contrôleur (surprise!)

Vue - Pour cette question, la vue sera une classe représentant une vue unique, qui dessine le polygone à l'écran.

Ma question est quelle est la meilleure façon pour la classe View d'obtenir des informations relatives à la classe de modèle Polygon? Bien que ce soit trivial pour cet exemple, j'espère que la réponse m'aidera lors de la construction d'applications plus compliquées. Options que j'ai;

1) Transmettez l'instance de la classe Polygon à la vue afin que la vue ait un pointeur. Ensuite, je peux simplement appeler rafraîchissement à tout moment et la vue va savoir quoi faire. C'est ce que je ferais d'habitude mais je cherche à briser l'approche MVC car la vue et le modèle semblent contourner le contrôleur, ce qui me fait penser que ce n'est peut-être pas la meilleure solution.

2) Avoir une méthode redessiner (...) dans la vue, qui prend comme arguments toute nouvelle information reçue. Cela semble propre mais ne serait pas bien à l'échelle je pense.

Tout conseil serait génial. Comme je le dis en général je ferais l'option un, mais aimerait que quelqu'un me dise quelque chose pour améliorer la façon dont je pense à ce sujet ....

Merci!

Répondre

2

L'essentiel ici est couplage. Si c'est trop serré, le design en souffrira, vous vous répéterez et le code sera difficile à maintenir.Si c'est trop lâche, cela rend les choses simples trop difficiles à gérer. Si vous voulez dessiner un polygone simple basé sur un modèle, vous devriez avoir le modèle à portée de main, car il serait fou de tirer tous les sommets à travers un contrôleur. Après tout, la vue est spécifiquement écrite pour afficher un polygone, de sorte qu'il est parfaitement naturel d'avoir un pointeur sur sa représentation.

Qu'est-ce que la vue not ne tient pas compte du contexte, de l '"histoire de vie" de l'objet affiché. Il peut provenir du réseau, il peut changer bientôt, il peut devenir deux fois plus grand lorsque vous cliquez dessus. La vue ne s'en soucie pas. Si vous cliquez dessus, la vue peut rapporter l'événement au contrôleur et ne s'en soucie plus. Si l'objet change, le contrôleur indiquera la vue à mettre à jour.

Je ne pense pas qu'il existe une règle stricte pour la conception de telles relations, mais le point est simple: garder le couplage lâche sans trop transpirer les détails. Cela m'aide souvent à penser aux tests et aux changements. Puis-je isoler le modèle pour le tester? Puis-je utiliser une vue complètement différente sans changer les autres parties? Puis-je écrire une interface utilisateur différente basée sur le même modèle? Que diriez-vous d'une "peau" différente? Combien devrais-je réécrire?

0

votre vue ne devrait rien faire d'autre que montrer la vue. Donc, si vous avez besoin d'afficher des informations mises à jour dans la vue, vous le faites depuis le cache (ce qui n'est pas vraiment applicable ici, mais je le rejette parce que c'est quelque chose que j'ai fait récemment avec des trucs web). vous réengagez le contrôleur et demandez au contrôleur d'appeler à nouveau la vue avec des données mises à jour sur le modèle. Donc, techniquement, votre deuxième option est la plus correcte. la vue doit se redessiner en appelant le contrôleur et en lui demandant des informations à jour.

0

Le modèle est une donnée. Le contrôleur est logique. La vue est l'affichage. En tant que tel, le modèle ressemble à un employé de données. Le contrôleur devrait être comme un administrateur ou un chef d'équipe dans un bureau. Et la vue devrait être comme un journaliste qui lit un lecteur de téléprompt. Le contrôleur peut gérer tout le monde et contrôler les données entrées et le texte sur le téléprompteur - et externaliser le travail réel vers le modèle (pour les données) et la vue (pour l'affichage).

En tant que tel, pour répondre à votre question. La vue devrait juste faire echo $this->view->myPentagon->someAttribute. Le contrôleur extrait l'objet myPentagon du modèle et l'affecte à l'objet de vue. Le modèle gère la structure de données et l'API de la base de données. La vue gère l'affichage. Le contrôleur indique à la vue quand afficher.

Questions connexes