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 :

Tutorial Swing mvc de Baptiste Wicht


Sujet :

MVC

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Mes questions s'appuient sur le tutorial "implémentation du pattern mvc" réalisé par Baptiste Wicht

    Je me demande si le modèle était un objet et pas simplement un int si l'on ferait passer une copie de l'objet ou l'objet même ? Autre question, on dit que le mvc est une composition des patterns strategy observer et composite. Pour l'observer le composite je les vois sur l'exemple mais j'ai du mal à cerner les patterns strategy. Pourriez vous les faire apparaitre (Il me semble que pour un stratégy des interfaces permettent d'encapsuler ldes actions de modification du modèle)?

    Je cherche un exemple un peu complexe ou le mvc serait appliqué. D'autres questions viendront après celles là.


    Merci

    Je donne le lien du tutorial :

    http://baptiste-wicht.developpez.com...onception/mvc/

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Bonjour,

    Pour ce qui est du pattern strategy, il s'agit en fait du contrôleur. Dans le MVC, on peut dire que le contrôleur est stratégie de la vue.

    Avec un contrôleur non générique, c'est assez difficile à percevoir. Mais en fait, comme en pratique, la vue ne connaît que la spécification du controlleur (son interface, en Java). On peut changer de manière transparente la logique de contrôle sans que la vue n'en soit impactée.

    Pour ce qui est du passage d'objet. En général, j'utilise 2 façons de faire :
    • Je passe directement l'objet à la vue
    • Je passe une liste d'informations que j'extrais depuis l'objet à la vue


    Mais dans le deux cas, ce n'est jamais la vue qui modifie directement l'objet. En général, la vue me renvoie ce que j'appelle un formbean (bean de fomulaire ?) qui contient les données de la vue et c'est ensuite le contrôleur qui va extraire, valider puis utiliser ces données pour mettre à jour l'objet.

    Pour ce qui est d'un exemple plus complexe, tu peux peut-être regarder les tutoriels de Serge Tahé, mais en général, il utilise un framework MVC (M2VC ou Spring MVC) pour construire son application.

    Voilà

  3. #3
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    Je vais parler dans un contexte web plutôt que Swing. Dans ce cas, le pattern Strategy est mis en oeuvre dans la couche contrôle : t'as un contrôleur frontal qui intercepte les requêtes des vues, et selon quelques paramètres (url, champs dans la requête, etc.) ça invoque un sous controleur (qui respecte un format déterminée, que ce soit implémenter une interface, annotations ou même un simple pojo) qui lui va effectuer le traitement réel.

    Ca peut être vu donc de cette façon : le controleur frontal choisit la stratégie adéquate pour traiter une requête qu'il reçoit.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Merci pour vos réponses.

    Moi je trouve étrange que le contrôleur instancie la vue. Pourquoi ? Car l'un des intérêts principaux du pattern stratégie est de pouvoir justement changer de stratégie à la compilation.

    Le changement de stratégie "vue.setController(new Controleur(Model m))" n'est pas possible ou plutôt pas efficace car le contrôleur va instancier à nouveau une vue. J'aurais plutôt fait un "vue.setController(new Controleur(Model m), this)" pour changer de stratégie. Le contrôleur se chargerait de faire le lien entre le modèle et la vue dans son constructeur "m.addModelListener(vue)" et "vue.setModel(m)".

    Instancier les modèles et les vues puis le contrôleur par un new Controleur(vue, model) me semble plus logique. Encore une fois, c'est juste mon interprétation, je cherche en fait à trouver une interprétation idéale du mvc( en vision non Web,M2VC etc..). Le livre "Swing" publié chez eyrolles commençait bien mais il simplifie ensuite l'architecture mvc afin qu'elle ne s'adapte seulement à Swing.

    Vu le nombre de visions du message sur "l'interprétation idéale du mvc" à l'adresse http://www.developpez.net/forums/d80...hitecture-mvc/ , je pense que quelqu'un qui présenterait dans un livre ou un tutoriel architecture mvc idéale utilisant une base de données (avec un DAO ou un frameWork à la Hibernate) d'une application un peu complexe avec tous les niveaux d'abstractions nécessaires ferait un malheur.

    Quoi qu'il en soit le tutoriel cité plus haut est un bon point de départ.

  5. #5
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Dans la pratique, les instanciations ne vont pas se faire avec un tel couplage.

    Personnellement, mes vues/contrôleurs/modèles ne sont jamais accédés que par leurs interfaces et les implémentations sont injectés par Ioc ou un autre système équivalent.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Quand tu dis "dans la pratique" cela signifie en version Web M2VC ou en version "classique" ?

  7. #7
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par alatox Voir le message
    Quand tu dis "dans la pratique" cela signifie en version Web M2VC ou en version "classique" ?
    Les deux.

    Personnellement, je développe surtout sur des applications Desktop et j'utilise Spring pour injecter les différentes couches de mon application.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    J'ai publié un message sur le forum concernant le livre "Swing" publié chez Eyrolles (Projet sweet home 3D). J'ai vu que tu as publié une critique du livre donc tu dois pouvoir sans doute répondre à mes interrogations, voici le lien : http://www.developpez.net/forums/d80...hitecture-mvc/

  9. #9
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut Question concernant le tuto de Baptiste Wicht
    Bonjour,

    Mes questions concernent aussi le tuto de Baptiste Wicht (http://baptiste-wicht.developpez.com...onception/mvc/ )

    Dans ce tuto le modèle VolumeModel contient une liste de EventListenerList .

    Ma première question est une demande confirmation, à savoir , si j'ai bien compris cette liste EventListenerList permet au modèle de notifier ses observer.

    Si c'est effectivement le cas, pourquoi ne pas tout simplement faire que la classe VolumeModel n'étende la classe Observable ?
    Les méthodes notifyObservers et addObserver de la classe Observable permettraient d'éviter d'implémenter respectivement les méthodes public void fireModelChanged et addVolumeListener de la classe VolumeModel


    Je suppose que si cela été fait ainsi c'est qu'il y a sans doute une bonne raison, si quelqu'un peut éclairer ma lanterne ...

    merci d'avance


    je me permet de remettre le code Baptiste Wicht pour que cela soit plus clair :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import javax.swing.event.EventListenerList;
    
    public class VolumeModel {
    	private int volume;
    	
    	private EventListenerList listeners;
    	
    	public VolumeModel(){
    		this(0);
    	}
    	
    	public VolumeModel(int volume){
    		super();
    		
    		this.volume = volume;
    		
    		listeners = new EventListenerList();
    	}
    	
    	public int getVolume() {
    		return volume;
    	}
    	
    	public void setVolume(int volume) {
    		this.volume = volume;
    		
    		fireVolumeChanged();
    	}
    	
    	public void addVolumeListener(VolumeListener listener){
    		listeners.add(VolumeListener.class, listener);
    	}
    	
    	public void removeVolumeListener(VolumeListener l){
    		 listeners.remove(VolumeListener.class, l);
    	}
    	
    	public void fireVolumeChanged(){
    		VolumeListener[] listenerList = (VolumeListener[])listeners.getListeners(VolumeListener.class);
    		
    		for(VolumeListener listener : listenerList){
    			listener.volumeChanged(new VolumeChangedEvent(this, getVolume()));
    		}
    	}
    }
    Medice Cura Te Ipsum

  10. #10
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    En fait, les deux façons de faire se valent

    Néanmoins, je préfère utiliser mon propre listener pour une raison de sémantique et de compréhension du code. Il est en effet plus simple de comprendre addVolumeListener plutôt que addObserver().

    Ensuite, un Observable est plus limité. Imagine que mon modèle contienne deux données, tu ne peux plus spécifier avec Observable lequel des deux a changés alors que tu peux étendre ta classe VolumeListener.

    Pour moi, la classe Observable s'applique plus à un objet par exemple un objet Volume qu'à un modèle de données qui peut contenir plusieurs données. Si tu ne veux pas implémenter toi-même certaines méthodes, je te conseille plutôt de t'orienter vers l'utilisation de la classe PropertyChangeSupport qui est plus souple que Observable

  11. #11
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    je m'en doutais un peu au vue des tests mais j'avais besoin d'une confirmation

    merci pour la rapidité et l'efficacité de ta réponse !! (Comme d'hab, )
    Medice Cura Te Ipsum

  12. #12
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Ma question sur le livre "Swing" de la collection "Les cahiers du programmeurs publié chez Eyrolles et publié ici http://www.developpez.net/forums/d80...hitecture-mvc/ dans le tout premier post n'a pas eu de réponse et c'était le but initial (sans doute car les personnes ayant répondu ne l'ont pas lu)

    J'aurais vraiment aimé avoir l'avis d'une personne qui l'a lu et très compétente en Java et développement d'IHM, c'est pour ça que je sollicite encore une fois Baptiste Wicht dans ce post ou toutes autres personnes l'ayant lu.

  13. #13
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    le lien que tu fourni ne semble pas fonctionner ...
    Medice Cura Te Ipsum

  14. #14
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    C'est celui-ci : http://www.developpez.net/forums/d80...hitecture-mvc/

    Il s'agit du tout premier topic que l'on trouve dans la partie MVC : "Interprétation Idéale de l'architecture MVC"

    Merci de me l'avoir fait remarquer

  15. #15
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut gestion des evt du model + hibernate +spring
    Bonsoir

    je continue de profiter du post de alatox (que je prie de m'excuser car je détourne un peu l'origine de son post ) sur le tuto de Baptiste Wicht

    Dans ce tuto le le modèle de vue est assez simple, j'aurai aimé avoir quelques précisons sur un cas un peu plus complexe (mais qui doit être assez courant ) :

    Dans mon cas j'utilise hibernate et spring

    Dans le tuto de Baptiste Wicht, la vue permet de modifier un champs déclaré dans la classe du modèle.

    Dans mon cas j'ai un modèle de vue qui contient (et qui observe) une instance de l'objet métier suivant

    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
    @Entity
    @Table(name = "FAXMODEL")
    public class FaxModel extends PersistantObject implements IFaxModel {
    
        private String lastNameTransmitter;
        
        @Column(name = "LASTNAME_TRANSMIT")
        public String getLastNameTransmitter() {
            return lastNameTransmitter;
        }
    
          public void setLastNameTransmitter(String lastNameTransmitter) {
            this.lastNameTransmitter = lastNameTransmitter;
        }
        
    }
    Dans ma vue je dois créer un champs qui permet de saisir la valeur du champs lastNameTransmitter de mon objet métier FaxModel

    Ma vue ne modifie donc pas directement un champs du modèle de vue. Elle modifie un champ (lastNameTransmitter) d'un champ (FaxModel ) du modèle de vue.

    Mon problème est de savoir quelle méthode utiliser pour que le modèle de vue soit notifier par mon objet métier

    D'après ce que j'ai lu (et surtout ce que j'ai compris ...) c'est à l'objet observé de "décider" s'il veut ou non notifier ses observers

    Dans mon cas , si j'ai bien compris , cela serait donc à mon objet métier FaxModel de "décider" s'il veut ou non notifier mon modèle de vue, puis que mon modèle de vue "décide" s'il veut ou non notifier ses observers

    Les setter de mes objets métier devront donc contenir un appel à une méthode de notifications, mon modèle de vue (observant l'objet métier), sera alors notifié que son champs FaxModel a été modifié. Il pourra alors décider s'il veut ou non ses observers

    Mais cette méthode est elle "compatible" avec hibernate ? cela ne va t il pas poser problème lorsque ce dernier va valoriser ces champs ?

    De même si spring "injecte" des valeurs dans mon objet métier ne vais je pas avoir des problèmes ?

    Dans ces deux cas j'ai peur qu'une grande quantité d'évènement soit générés


    Si quelqu'un peut m'enlever ses doutes (ou souligner les points que j'ai mal compris ...) cela serait très sympas

    Dans touts les cas merci d'avoir lu mon post jusqu'au bout
    Medice Cura Te Ipsum

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/07/2011, 16h22
  2. Avis sur mon nouveau site : baptiste-wicht.developpez.com
    Par Baptiste Wicht dans le forum Mon site
    Réponses: 12
    Dernier message: 07/12/2009, 19h47
  3. [Swing] Création d'une interface graphique SWING + MVC
    Par Sylmandel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/04/2006, 09h03

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