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 :

[MVC] Création dynamique d'objets


Sujet :

MVC

  1. #1
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut [MVC] Création dynamique d'objets
    Bonjour à tous,
    Et oui, encore une question sur MVC...
    Dans une application MVC, comment gérer la création dynamique d'objets?
    Par exemple dans une fenêtre principale, l'utilisateur clic sur un bouton Créer un objet. Cette infos est transmise à la couche modèle via le controleur. La couche modèle crée l'objet. Mais comment l'afficher? Crée-t-on un controleur et une vue pour cette objet?
    Vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Clic Détecté :
        Avertir Controleur Clic Détecté
    Controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Avertir Controleur Clic Détecté : 
        Modèle.CréerObjet
    Modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CréerObjet :
        Nouvel Objet objet
        objet.Nom = "blabla"
    Comment remonter l'info à la vue qu'un nouvel objet nommé "blabla" a été crée. La Vue ne possède pas de référence à l'objet crée.
    Faut-il crée un évènement ObjetCréeEvent avec un paramètre Objet? ou alors un controleur et une vue?
    MVC me pose des problèmes dans ce cas.
    Merci...

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Personnellement, je crée un événement dans le contrôleur comme quoi un objet est crée et la vue se met à jour quand elle recoit cet événement.

    Donc on a ça au niveau communication :

    1. Vue : Clic
    2. Vue : Envoi des informations sur le nouvel élément au controleur
    3. Contrôleur : Dit au modèle de créer un nouvel élément
    4. Modèle : Crée le nouvel élément
    5. Modèle : Génère un événement pour indiquer que l'objet est créé
    6. Vue : Se met à jour quand elle recoit l'événement


    Je sais pas si c'est la bonne manière de faire, mais moi j'aime bien.

  3. #3
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Merci de ta réponse.
    La vue reçoit l'évènement nouvelObjetCrée avec l'objet en paramètre.
    Admettons que la Vue crée un panel dynamiquement avec une textBox pour afficher le nom "blabla". Comment fais tu si l'utilisateur change "blabla" en "toto" pour faire descendre l'info à l'objet? Il faut que le controleur soit à l'écoute de cette textbox pour receuillir l'info et la transmettre au modèle.
    Vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    objectCreatedEvent(object) : 
        new Panel panel
    Tu fais quoi après ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objectCreatedEvent(object) :
        new Panel panel
        controleur.Register(panel, object)
    Controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Register(panel, object) :
        RegisterEvent(panel.textbox.TextBoxLeaveEvent)
    
    OnTextBoxLeaveEvent(String name) :
        object.name = "toto"
    etc... Je m'emmèle...
    Comment maintient tu à jour les données de ton objet crée dynamiquement?
    PS : J'ai jamais eu l'occasion de te remercier pour ton excellent tuto sur MVC. C'est de loin le meilleur que j'ai trouvé sur le web. L'idée du découplage de la vue à travers une interface exposée par le controler est top. Un grand merci...

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Comment maintient tu à jour les données de ton objet crée dynamiquement?
    Tout dépend de comment fonctionne ton interface graphique. Si les données ne sont validées que sur pression d'un bouton, il te suffit lors du clic sur le bouton d'avertir le contrôleur que les données ont changées et de lui donner les nouvelles données.

    Dans le cas ou tes objets sont mis à jour automatiquement sans bouton, il faut vérifier chaque champ avec des listeners et à chaque modification du champ (changement de la séléction pour une liste, perte de focus pour un champ texte, ...), il faut avertir le contrôleur qui va se charger de la suite.

    Pour savoir ce qui est modifié, il faut effectivement conserver une référence vers l'objet. Si tu as un objet courant et plusieurs panels créés dynamiquement, tu peux conserver la référence de l'objet courant dans le contrôleur et avoir une clé dans le champ permettant d'identifier la valeur que le champ modifie.

    Dans le cas ou tu as plusieurs objets affiché à l'écran, il faut obligatoirement que le champ conserve soit une référence vers l'objet, ce qui n'est pas terrible, soit une référence vers quelque chose permettant d'identifier l'objet.

    Je sais pas si je suis clair

    Citation Envoyé par dahtah Voir le message
    PS : J'ai jamais eu l'occasion de te remercier pour ton excellent tuto sur MVC. C'est de loin le meilleur que j'ai trouvé sur le web. L'idée du découplage de la vue à travers une interface exposée par le controler est top. Un grand merci...
    Merci

  5. #5
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Si les données ne sont validées que sur pression d'un bouton, il te suffit lors du clic sur le bouton d'avertir le contrôleur que les données ont changées et de lui donner les nouvelles données.
    La non plus le controleur n'a pas encore de référence à l'objet crée. Il faut donc enregistrer la référence d'objet dans le controleur.

    Citation Envoyé par Baptiste Wicht Voir le message
    Dans le cas ou tes objets sont mis à jour automatiquement sans bouton, il faut vérifier chaque champ avec des listeners et à chaque modification du champ (changement de la séléction pour une liste, perte de focus pour un champ texte, ...), il faut avertir le contrôleur qui va se charger de la suite.

    Pour savoir ce qui est modifié, il faut effectivement conserver une référence vers l'objet. Si tu as un objet courant et plusieurs panels créés dynamiquement, tu peux conserver la référence de l'objet courant dans le contrôleur et avoir une clé dans le champ permettant d'identifier la valeur que le champ modifie.
    Tu pourrais préciser un petit peu s'il te plait? Que veux-tu dire par clé dans le champ? Je vois ce qui me pose problème, c'est la transmission des données entre Vue dynamique et controleur. Je peux faire :
    Vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    controler.RegisterObject(object)
    OnTextBoxLeave() :
        controleur.NotifyNameChange(object, textBox.Text)
    Controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NotifyNameChange(object, textBox.Text) :
        object.Name = textBox.Text
    RegisterObject(object) :
        List.Add(object)
    Le problème, c'est que si j'ai plein d'objet, je vais multiplier mes méthodes dans le controleur...
    Citation Envoyé par Baptiste Wicht Voir le message
    Je sais pas si je suis clair
    Si. Merci bien.

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Le problème, c'est que si j'ai plein d'objet, je vais multiplier mes méthodes dans le controleur...
    Tu peux aussi faire une seule méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    propertyChange(propertyName, newValue)
    et agir en fonction du nom de la propriété. Mais je ne suis pas sûr que le nombre de méthodes soit un problème.

  7. #7
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Pour résumer,
    entre Vue et Controleur,
    j'enregistre mon objet et mon panel associé (ou son interface). Ceci me permet depuis le controleur d'afficher ou de masquer mon panel tout en découplant la Vue du Controleur (pour masquer, désactiver, ouvrir...).
    Dans le controleur je rajoute autant de méthode que de type d'objets, je pense que cette méthode est meilleure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    controleur.NotifyNameChanged(object, oldName, newName) :
        object.Name = newName
    Un seul point me dérange c'est la centralisation de tout dans une sorte de super-controleur.
    En tout cas, merci beaucoup Baptiste.

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    J'ai pas tout compris à ton dernier post

    Mais toujours dans un esprit de séparation des couches, quand tu parles d'afficher/masquer le panel, il faut faire attention à ne pas lier le contrôleur à la partie présentation. Tu peux lui passer une interface générique et ensuite implémenter la méthode concrète dans la partie présentation.

    Pourquoi un super contrôleur ? Il contient pas mal de code, mais en fait, il ne fait que passer les informations de la vue au modèle, donc pas grand chose en conclusion, non ?

  9. #9
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Mais toujours dans un esprit de séparation des couches, quand tu parles d'afficher/masquer le panel, il faut faire attention à ne pas lier le contrôleur à la partie présentation. Tu peux lui passer une interface générique et ensuite implémenter la méthode concrète dans la partie présentation.
    C'est ce que je voulais dire par :

    Citation Envoyé par dahtah Voir le message
    Pour résumer,
    entre Vue et Controleur,
    j'enregistre mon objet et mon panel associé (ou son interface). Ceci me permet depuis le controleur d'afficher ou de masquer mon panel tout en découplant la Vue du Controleur (pour masquer, désactiver, ouvrir...).
    Merci bien de ton aide en tout cas...

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par dahtah Voir le message
    C'est ce que je voulais dire par :
    Oki, j'avais pas bien compris


    Citation Envoyé par dahtah Voir le message
    Merci bien de ton aide en tout cas...
    Mais je t'en prie

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

Discussions similaires

  1. [GLScene] Création dynamique d'objet
    Par Matt2094 dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2010, 13h28
  2. [C#] Création dynamique d'objets
    Par Gloups dans le forum Windows Forms
    Réponses: 7
    Dernier message: 16/08/2006, 01h52
  3. Création dynamique d'objets ?
    Par Arthur A. dans le forum C++
    Réponses: 6
    Dernier message: 15/06/2005, 23h55
  4. création dynamique d'objet, projet win32
    Par noinneh dans le forum MFC
    Réponses: 5
    Dernier message: 03/02/2005, 16h07
  5. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37

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