IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC Discussion :

Method actionPerformed(): dans Controleur(alors listener de la Vue) ou dans la Vue!


Sujet :

MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut Method actionPerformed(): dans Controleur(alors listener de la Vue) ou dans la Vue!
    Bonjour,

    Je viens de tomber sur ce lien:
    http://www.cyber06.com/article/mvc.php

    Et quelque chose m'interpelle:

    On voit dans cet exemple que le Contrôleur est quelque part observateur (listener) de la Vue:
    La méhode actionPerformed() y est en effet écrite dans la classe Contrôleur!
    Cela vous choque-t-il?
    Est-ce normal, obligatoire, courant?

    Non parce-que moi je plaçais cette méthode dans la Vue!


    Merci pour vos avis.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 89
    Par défaut
    Bonjour,

    Pour ma part en tout cas, le seul point qui me gène un peu c'est la méthode getTexteTape().
    Le reste me paraît correct.

    En mettant le actionPerformed dans le contrôleur, on a l'impression que c'est le contrôleur qui reçoit les évènements utilisateurs.
    Le diagramme de séquence montré amplifie cette impression d'ailleurs
    Mais en l'occurrence c'est effectivement la vue qui envoie les actions utilisateur au contrôleur.
    Seulement ici c'est implicite :
    bouton.setActionCommand("modificationdevue");
    Le controleur ne reçoit que "modificationdevue", pas une requête de type bouton.clic().
    Donc jusque là pas de soucis pour moi.

    En revanche personnellement j'éviterais de faire demander au contrôleur des infos à la vue (vue.getTexteTape()).
    Donc au final je mettrais également le actionPerformed dans la vue et créerais une requête possédant les paramètres suffisant pour que le contrôleur n'ait pas à redemander derrière des données supplémentaires à la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modificationdevue(texte.getText());
    Ca aurait accessoirement l'avantage de ne pas avoir à faire un switch qui pourrait être important dans le cas d'un grand nombre de boutons.

  3. #3
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    La méhode actionPerformed() y est en effet écrite dans la classe Contrôleur!
    Cela vous choque-t-il?
    Est-ce normal, obligatoire, courant?
    La gestion des évènements étant le fait du contrôleur, cela ne me choque pas.
    En revanche personnellement j'éviterais de faire demander au contrôleur des infos à la vue (vue.getTexteTape()).
    Ceci est bien évidemment une erreur ! Normalement, le texte tapé dans l'interface aurait dû être récupéré via le modèle associé au champ texte !

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Oui cela me choque car ce n'est pas le rôle d'un controleur que d'intercepter les événements bas niveau comme les clics et les saisies aux claviers. Il s'agit de responsabilités incombant à l'IHM.

    Ce qui me choque encore plus c'est que le contrôleur implémente les WindowListeners....

    Couramment ce que j'ai plutot vu c'est l'IHM qui écoute les événements de clic et dans la méthode actionPerformed on fait un Controleur.clicBouton1();

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 89
    Par défaut
    Bonjour,

    Ceci est bien évidemment une erreur ! Normalement, le texte tapé dans l'interface aurait dû être récupéré via le modèle associé au champ texte !
    Je ne pense pas que ce soit une erreur.
    L'appel en question est fait par le contrôleur au moment où le bouton est cliqué.
    Il demande alors à la vue quelle est la nouvelle valeur.
    Il ne peut la récupérer que dans la vue, pas dans le modèle.

    Le point que je soulevais c'est que je privilégierais une requête avec paramètres plutôt qu'une remontée d'évènement basique avec toutes les nouvelles données à récupérer aprés.
    Ceci dit je pense que les deux façons de faire sont valables.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut
    Merci à tous pour vos interventions,


    Déjà, ça me rassure de savoir que mettre actionPerformed() dans la Vue n'est pas une erreur: et pour ma part c'est la solution que je continuerai d'adopter. Ton avis en particulier hegros me conforte bien dans ce sens.

    J'apprends également que le fait que le contrôleur soit LISTENER de la Vue
    n'est pas -(en tout cas pas aux yeux de tous)- un crime, et que l'on resterait quand même dans du MVC.
    Ceci dit je suis surpris que dans du MVC , on puisse avoir le Contrôleur OBSERVATEUR de la VUE, de façon aussi claire: implements ...listener !!
    Ca vous choque vraiment pas du tout Patriarch24 et tristan_m ??!


    -----------------

    Concernant l'autre point:
    Le fait que ça soit le Contrôleur qui aille demander à la Vue le texte tapé:
    this.vue.getTextTape() MOI JE SUIS CARREMENT POUR à 200% !!

    Pourquoi:

    1-Tout d'abord: tout simplement parce-que la Vue n'a pas à savoir quelle information intéresse le Contrôleur lorsqu'elle va l'informer qu'un événement (1 Clic en l'occurence) vient de se produire: C'est au Contrôleur de savoir, au moment où il est prévenu de l'événement, les champs de la Vue qu'il souhaite lire: POUR MOI C'EST EVIDENT que c'est la meilleure(enfin ça semble logique non?! ) façon de faire.

    2- Autre argument:
    D'ailleurs si un jour les champs que doit lire le Contrôleur, suite au clic sur la Vue, changent: ben, pas besoin de modifier la Vue: juste le Contrôleur, puisque la Vue fera toujours son this.Controleur.clicSurBoutonX() tel quel, juste pour informer du clic !!!



    Qu'en pensez-vous?

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    En fait j'en pense que c'est acceptable comme une des centaines de variantes qu'il peut exister.

    Ce qui me gêne le plus c'est qu'en continuant à rendre responsable le controleur de toutes les événements de vue cela va en faire une classe poubelle car dans une application il n'est pas rare d'avoir plusieurs vues.

    Autant je veux bien reconnaître qu'un des rôles du controleur soit la gestion des événements mais c'est plutot relatif à ceux du système et ce genre de chose.


    Pour le texte tapé je rejoins rp37000. Le principe de base de MVC c'est séparation strict entre Modèle et Vue. Faire un vue.getText() dans le modèle est une erreur car le modèle ne doit jamais connaître la vue (avoir une instance).

    Pour résumé, tant qu'on en reste à une application basique comme dans l'exemple cela reste bien entendu une conception correcte par contre dans le cas de plusieurs vues (des dizaines ou centaines) de domaine fonctionnel différent cela fait perdre de la cohésion au controleur et se serait fatalement une mauvaise conception.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Condition dans controleur
    Par allbizznet dans le forum MVC
    Réponses: 2
    Dernier message: 28/12/2007, 12h10
  2. Réponses: 2
    Dernier message: 08/10/2007, 10h35
  3. Réponses: 11
    Dernier message: 23/03/2007, 19h38
  4. Réponses: 17
    Dernier message: 17/07/2006, 17h27
  5. Mettre une methode dans un event listener
    Par FidoDido® dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/07/2006, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo