6
votes

Java MVC - n'a pas l'impression que je l'obtiens

En tant que débutant dans la programmation, il me bugs quand je rencontre des murs. Actuellement, l'un des murs est co-dépendre des objets.

Comme vous pouvez le voir dans mon historique des questions, je travaille actuellement sur une application BlackBerry, dans laquelle j'ai mis en œuvre quelque chose que j'appelle le modèle MVC, mais ce n'est pas exactement ce que je pense que c'est censé être. P>

Vous voyez, un programmeur novice vous regardez sur des résumés comme ce graphique et vous obtenez l'idée derrière elle. Mais la mise en œuvre est une autre chose. P>

text alt http://www.ibm.com/developerworks/wiress/library/wi-arch6/theoretical.gif p>

S'il vous plaît, n'arrêtez pas de lire :) Je vous montre Certains du code de moi, qui contient des trucs spécifiques Blackberry, mais vous devriez voir ce que je fais. p>

Point d'entrée principal pour mon application forte> p>

controller = new ContactManagerMainScreenController(this , model);


0 commentaires

4 Réponses :


11
votes

MVC est une abstraction intéressante, mais a des problèmes.

En réalité, le contrôleur et la vue sont souvent jumelés - même si en théorie, vous devriez pouvoir remplacer l'un ou l'autre sans l'autre, en réalité, les mécanismes d'interface à différentes vues sont si différents que le contrôleur et la vue sont combinés.

La meilleure description que j'ai vue relative à Java est que la vue est votre composante oscillation afin que votre partie du code de vue n'est rien que de placer ces composants à l'écran.

Votre contrôleur est le reste de cette classe, les auditeurs et le reste de votre code qui interagit avec la vue.

Ma suggestion serait de ne pas trop m'inquiéter de l'isolation de la vue et du contrôleur, mais cela dit, je suis totalement derrière la séparation très forte entre le modèle et la vue / contrôleur.

Edit / Avancé: J'ai utilisé un motif où le contrôleur et la vue sont isolés et il est plus flexible, mais il a tendance à être beaucoup plus de travail. Je pense que Struts utilise le modèle de liaison - si vous souhaitez voir des techniques d'abstraction, vous pouvez regarder là-bas ou rechercher des éléments sur les contrôles de balançoire "Binding".


7 commentaires

(Bien que si quelqu'un peut faire une affaire pour savoir comment séparer la vue et le contrôleur, je serais très intéressé.)


Merci pour votre facture de réponse. Comme vous le réalisez, l'une de mes craintes est de «écrire un mauvais code». Pense que ma mise en œuvre est acceptable? Une autre chose: "[...] que la vue est votre composante Swing et que votre code de vue n'est rien que de placer ces composants à l'écran. [...]" Vouliez-vous dire "[...] votre code de contrôleur est rien [...]"?


Il est possible de séparer la vue et le contrôleur, mais IMHO n'est pas aussi propre que possible dans une application Web.


Ouais, j'ai utilisé le mot modèle plusieurs fois quand je pensais contrôler. Je pensais que je les ai tout portée sur l'examen. Aussi, votre code a l'air bien - j'ai vu beaucoup pire. Si vous deviez développer 50 écrans avec des dizaines de contrôles sur chacun, je dirais sérieusement créer un système qui utilise une liaison, mais pour seulement quelques écrans, les techniques traditionnelles fonctionnent bien.


@Praveen Pas vraiment, sur une application Web, votre "View" est "The web". Si vous passez à une autre vue (indiquez des commandes pivotantes, ou une base de données frontale ou une CLI, je parie que vous allez remplacer la plus grande partie de votre code de contrôleur). MVC ne semble que plus facile sur le Web car vous supposez que vous ne changez jamais de vues.


@Zarkonnen - Bien sûr, avez un fil de contrôleur qui surveille une file d'attente d'événement. Les modèles et la vue placent des choses sur cette file d'attente chaque fois qu'ils ont une action. Comme les éléments sont évolués de la file d'attente, certaines actions sont effectuées par le contrôleur et les messages sont envoyés à la vue ou au modèle (selon le message).


@Zarkonnen - Considérons une vue de table. Le contrôleur contient une liste d'objets de modèle et le contrôleur implémente une interface "TableDataSource" que la vue de la table définit. La vue de table n'est pas liée au contrôleur, elle est liée à TabledataSource. Cela crée une juste quantité de séparation en utilisant une injection de dépendance.



1
votes

Dans mon point de vue, c'est quelque chose que j'ai rencontré lorsque j'ai essayé d'abord de séparer mes modèles, mes vues et mes contrôleurs de ma première application de bureau.

Avec des applications Web, le motif MVC convient très naturellement en raison de la nature innée du Web, mais malheureusement, il n'est pas possible d'adapter un PURE MVC Patter à une application de bureau, où le système d'exploitation joue un rôle innant dans les notifications. Cela conduit généralement au motif mis en œuvre comme vous l'avez montré dans votre diagramme.

Cependant, le modèle que vous avez montré doit vraiment être mis en œuvre comme ceci, je pense (je suis retourné à. NET après une brève affaire avec Java, veuillez donc garder cela à l'esprit): xxx

Entre-temps, le contrôleur serait responsable de la réception des actions des utilisateurs. Donc, si vous avez un bouton qui dit "Basculer les favoris", cela provoquerait que le contrôleur appelle _Model.ShoworhideFavoritesList (). Le modèle se mettait à jour et demande à la vision de se rafraîchir en utilisant son nouvel état.

La vue serait désormais libre de la dépendance sur le contrôleur.


3 commentaires

Encore une fois, merci pour votre réponse. Votre mise en œuvre conduirait à un modèle qui contrôle directement l'interface utilisateur elle-même. Souhaitez-vous suggérer de laisser tomber l'ensemble du contrôleur?


Non, veuillez lire mes deux derniers paragraphes après le code. Le contrôleur est responsable de la gestion de toutes les notifications utilisateur. Voici un autre exemple. Disons que l'utilisateur clique sur "Ajouter un nouveau contact", le contrôleur serait responsable de l'appelant _model.addnewcontact (String FirstName, String Nom). Le modèle ajouterait alors ce contact à son propre état interne puis appelle rafraîchir (Ceci) sur la vue.


Ce que je veux dire, c'est que le contrôleur est toujours responsable de la capture de toutes les notifications utilisateur, puis de décider comment mettre à jour le modèle. Le modèle appelle alors toujours rafraîchir la visualisation (ceci) sur la vue qui se réjouit ensuite ...



3
votes

Je ne pense pas que le diagramme est très bon et fait probablement des choses beaucoup plus déroutantes.

Le contrôleur doit être responsable de donner au modèle à la vue. Le modèle ne doit contenir rien de plus que de simples accesseurs pour vos données. Toute nécessité d'interagir avec le modèle - ou de modifier l'une de ses valeurs - devrait avoir lieu à travers le contrôleur.

De cette façon, la vue doit seulement savoir comment rendre / présenter le modèle à l'utilisateur. Donc, toutes les opérations sur le modèle - choses telles que sauvegardefavoritecontactTolocalstorage () - doivent être des méthodes du contrôleur, pas la classe de vue. En outre, le contrôleur ne doit pas nécessiter une référence à la vue à construire - je pense que cela finit par inverser l'ordre prévu de l'ensemble du motif MVC.


2 commentaires

Je crois que son diagramme est correct. Le problème est que MVC n'est pas une bonne abstraction et chaque boîte à outils ajuste de telle manière de le faire correspondre à la manière dont ils l'ont conçue. Certains font un bon travail, certains pas si bien - la seule chose qui est sûre, c'est que si vous changez de vue, vous allez finir par changer le contrôleur (qui est contre la théorie).


Peut-être. Je ne suis vraiment plus familier avec l'utilisation de MVC dans des contextes Web, auquel cas le contrôleur renvoie simplement la vue et le modèle à utiliser (comme dans le printemps MVC). Je suppose que cela pourrait être assez différent sur le bureau.



2
votes

Je suis d'accord avec Bill K. Standard MVC n'est pas si important lors de la gestion du client riche. C'est un excellent modèle lorsque vous écrivez des applications Web en tant qu'événements (clics de votre navigateur) sont très différents de votre vue (Rendoir HTML).

Avec interface graphique standard, un meilleur modèle est quelque chose appelé PAC (présentation / abstraction / contrôle). Ici, la présentation est (la vue + le gestionnaire d'événements), le contrôleur gère les échanges entre la présentation et l'abstraction. Et l'abstraction est votre modèle commercial.

De cette façon, vous avez un contrôleur qui gère le lien entre la partie GUI (vue + Evénements utilisateur) et votre abstraction. Vous avez un agent PAC pour tout morceau d'interface graphique que vous développez et une séparation propre entre eux.

Un autre article sur quelque chose de mieux que MVC lié à PAC: HMVC . Assez vieux, mais c'est pratique et cela aide à comprendre les choses.


0 commentaires