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

avec Java Discussion :

[Architecture MVC] Service ou controller?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 228
    Par défaut [Architecture MVC] Service ou controller?
    Bonjour à tous,

    Je suis étudiant et j'essaie de prendre le maximum de bonne pratiques pour préparer mon insertion professionnelle. J'ai un gros projet à faire en Java.
    J'ai choisi de l'implementer en MVC; pour les interressés, je mettrais un lien vers un repo github public des que possible.
    Le problème est le suivant : Ou mettre la logique métier d'un jeu de carte comme le Uno ? Dans un service ? Dans le controller ? Dans un modèle ?

    - 1 Dans un service ?
    D'apres ce que j'ai compris c'est la solution la plus propre. Un service est en quelque sorte un controller, sauf qu'il interragit avec le modele par exemple et permet le traitement de données. Super, mais comment l'instancier? Dans le main ? Avec un simple pattern singleton ?

    Dans le cas du uno : que va faire le service : un tour de jeu ? Une distribution ? Ou quelque chose de plus "atomique"?

    - 2 Dans un controller ?
    Pourquoi pas après tout ? Solution la plus simple, que j'ai pour l'instant implementé, qui fonctionne mais qui n'a pas été accepté par le prof.

    - 3 Dans un modele ?

    Solution du prof.. Ai je raté un truc ??????


    Merci a ceux qui repondront,
    Nepe

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 228
    Par défaut
    Hello à tous,
    Je comprend toujours pas.
    Est ce que le controller avec l'action ActionPerformed doit être changeable facilement si l'on veut mettre une vue réseau? Est ce que le modèle peut être interchangeable ?
    Comment delier l'actionListener du controller ?

    Nepe

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 49
    Par défaut
    Bonjour,

    Il me semble qu'il y a un cours sur le MVC très bien fait sur ce site mais, pour résumer, ton prof a raison :

    -Le MVC se traduit par Model, Vue, Controler : Le Model représente la partie métier de ton application, la Vue est l'interface graphique de ton application et le Controler permet de transmettre les actions effectué sur la vue vers la partie métier.

    -C'est bizarre ce que tu veux faire : Pour moi le Controler ne gère aucun Listener (donc pas d'actionPerformed dans le code du controler).

    - https://docs.oracle.com/javase/7/doc...tenerList.html Cet Objet te permettra de gérer plusieurs Listener dans ton model.

    Maintenant on va reprendre pour ton programme en se basant sur ma façon de faire un MVC : Tu construis ta vue (donc la partie graphique de ton jeu de carte), tu rajoutes les méthodes tel que uno(); addActionListener(ActionListener listener); etc.. Dans le corps de ces méthodes, tu appelles les méthodes associé dans ton Controler (fireUno(); fireActionListener(ActionListener listener); etc..). Dans le corps de ces méthodes tu vas construire l'Event (ActionEvent dans ton cas) et transmettre le tout au Model associé => Ton Model fait son travail et grâce au EventListenerList retransmet la notifications qu'il a subit une modification aux vues implémentant tes ActionListener.

    Personnellement, mes Controler sont souvent en Singleton, mais si tu veux pouvoir mettre un nouveau controler entre ta vue et ton model il te suffit juste de rajouter un setControler(Controler newControler) dans ta vue et faire les changements nécessaires.

    Voila ce que je peux te dire pour l'instant, si tu veux plus d'aide il me faudrait voir ton code

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 49
    Par défaut
    Je te mets un peu de code pour que tu visualises mieux ce que je veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Vue{
       Controler control;
    ...
       public void uno(){
          control.fireUno(this);
       }
     
       public void addActionListener(ActionListener listener){
          control.fireAddActionListener(listener);
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Controler{
       Model model;
    ...
       public void fireUno(Vue view){
          ActionEvent event = new ActionEvent(view, 0);//Met l id correspondant a l'action que tu veux faire
          model.uno();
          model.fireEvent(event);
       }
     
       public void fireAddActionListener(ActionListener listener){
          model.addActionListener(listener);
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class Model{
       EventListenerList list;
    ...
       public void uno(){
          //Faire le travail du Uno
       }
     
       public void addActionListener(ActionListener listener){
          list.add(ActionListener.class, listener);
       }
     
       public void fireEvent(ActionEvent event){
          for(ActionListener action : list.getListeners(ActionListener.class){
              action.actionPerformed(event);
          }
       }
    }
    Voici un exemple de MVC, j'espere que cela t as aidé

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 228
    Par défaut
    Merci pour la réponse

    J'ai plusieurs questions :
    Si on ne met pas d'ActionPerformed dans le controller, on gère comment les entrees de l'utilisateur ?
    Quel est la difference entre le pattern observable / observer & actionListener ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 49
    Par défaut
    Mmh Je vais te donner un exemple de class qui utilise l'architecture MVC : JButton

    pour ajouter un ActionListener a un JButton tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myButton.addActionListener(new MyAction());
    on est d'accord?

    Pour pouvoir intercepter les action de l'utilisateurs sur le bouton ca se passe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class MyAction implements ActionListener{
       public void actionPerformed(ActionEvent event){
         ....
       }
    }
    C'est exactement ce que fait mon exemple : La class contenant ta Vue (ou dans la vue elle même si tu veux) tu définis une classe ActionListener et tu l'ajoutes a ta Vue et après, dès qu'une modification survient sur la Vue, le model le transmettra a TOUT les ActionListener qui lui ont été ajouté (et donc aux méthodes actionPerformed).

    Déjà Observer et Observable sont des Interfaces qui vont définir des Objets et actionPerformed est une méthode de l'interface ActionListener (ce n'est pas pareil). Le MVC contient les pattern Observer/Observable, en effet la Vue est un Observer du Model qui lui est Observable (ces interfaces existent et tu peux les implementer aux vue et model si tu le veux) l'ActionListener quant a lui n'est qu'un écouteur (Il va écouter les actions utilisateurs et faire les actions nécessaires en fonction de l'Event) De plus il permet au modèle de notifier ses vues de divers changements (C'est a dire qu'il va dire a sa vue qui le représente, qu'il a subit un changement et la vue va l'observer pour voir les changements effectué).

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

Discussions similaires

  1. [Séquence] Architecture MVC - Web Service
    Par Laidback dans le forum Autres Diagrammes
    Réponses: 0
    Dernier message: 17/05/2012, 14h09
  2. architecture mvc etxml/xsl
    Par kiko2005 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/08/2009, 14h52
  3. Utiliser une architecture MVC
    Par misterniark dans le forum MVC
    Réponses: 5
    Dernier message: 03/11/2006, 22h35
  4. Réponses: 5
    Dernier message: 12/05/2006, 22h02
  5. Architecture MVC
    Par Bobleponge dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 20/06/2005, 10h16

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