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

C++ Discussion :

[architecture] comment faire remonter des donnees?


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut [architecture] comment faire remonter des donnees?
    Bonjour à tous,

    imaginons un programme avec une structure de type:
    une classe "mère" qui gère le programme, et qui est une agregation de tout un tas de classes, qui elles-même sont des agregation d'autres classes. En gros, ce serait un arbre où les feuilles sont de petites classes spécialisées, et les noeuds sont des interfaces plus complexes. Dans cette structure, il n'y a quasiment pas d'héritages entre les classes.

    Ma question est la suivante:
    - Quel est le meilleurs moyen pour faire remonter des données des classes "feuilles" à la classe "mère"?

    Concrètement: J'ai une donnée dans une classe "feuille", et j'en ai besoin dans ma classe mère à un moment donné. Je voudrais éviter de créer des accesseurs dans chaque classe "noeud" pour faire remonter la donnée tout en haut. Existe-t-il d'autres moyens? Ou existe-t-il des méthodes de conception pour éviter ça?

    Merci.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    C'est marrant, je me pose la même question en ce moment.

    Une technique que j'utiliserais, serait de passer une adresse de quelque chose. Par exemple un pointeur sur une zone mémoire où tu voudrais que la classe "feuille" écrive les données. Ce pointeur serait bien sûr passer de classe en classe, jusqu'à la classe visée.

    Ta classe mère connaissant aussi cette adresse, elle pourra récupérer les données.

    Mais le principe des classes c'est justement d'avoir un contrôle sur tout ceci.
    En faisant de la sorte, tu risques de poser des mines dans ton programme. Lorsque ton programme deviendra très important, ça risque d'être difficile de trouver les erreurs.

    Le fait de tout faire remonter jusqu'à la classe mère t'oblige à contrôler que tout se passe bien, et surtout à ne pas modifier n'importe quoi n'importe où.

    Je reconnais que c'est un peu lourd, mais des fois de reconsidérer la structure de ton programme pourra t'aider à trouver une meilleure solution.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    Je voudrais éviter de créer des accesseurs dans chaque classe "noeud" pour faire remonter la donnée tout en haut
    pourquoi ?

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par moldavi
    Le fait de tout faire remonter jusqu'à la classe mère t'oblige à contrôler que tout se passe bien, et surtout à ne pas modifier n'importe quoi n'importe où.
    En fait, je n'ai besoin de faire remonter que quelques valeurs.
    Citation Envoyé par moldavi
    Je reconnais que c'est un peu lourd, mais des fois de reconsidérer la structure de ton programme pourra t'aider à trouver une meilleure solution.
    Je ne pense pas pouvoir améliorer la structure de mon programme (je n'ai pas encore assez d'expérience en langage oo pour ça ).

    Ce que je voudrais, c'est un truc dans le style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A{
    int toto;
    }
    class B{
    A a;
    }
    class C;
    ...
    class Z{
    Y y;
    }
    et là, si j'ai besoin d'acceder à la variable A::toto à partir de ma classe Z, je n'ai pas besoin de faire remonter la donnée en passant par les classes B, C... Y.
    Mhh, bon, je commence à radoter moi :/ je me répète, c'est l'age

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par dok3
    Je voudrais éviter de créer des accesseurs dans chaque classe "noeud" pour faire remonter la donnée tout en haut
    pourquoi ?
    parce que ça me fait perdre du temps et je trouve que ce n'est pas propre: si je doit passer par 10 classes et dans chacune d'entre elle, créer un accesseur, ça fait prend du temps. Et puis on va avoir un accesseur dans la classe qui va faire remonter une donnée qui n'a rien à voir, je trouve que ça fait désordre non?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    oui mais pourquoi ? en dehors d'ecrire z.y().x.()......b().a ... qu'est ce qui t'embete ?

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par dok3
    oui mais pourquoi ? en dehors d'ecrire z.y().x.()......b().a ... qu'est ce qui t'embete ?
    ben c'est ça qui m'embête justemement.

    Et puis aussi, si je suis obligé de faire ça, c'est parce qu'il y a queque chose que je n'ai pas compris dans le langage oo.

    Est-ce possible de créer un pointeur dans ma classe "mère" qui pointe sur la donnée d'une classe "feuille"?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Est-ce possible de créer un pointeur dans ma classe "mère" qui pointe sur la donnée d'une classe "feuille"?
    Oui.
    Par contre j'ai des doutes quant à ton design de classes, ça me paraît inhabituel ce que tu souhaites faire. Peut-être serait-ce là-dessus qu'il faudrait réflechir ? Tu peux préciser ce que font les classes et pourquoi tu cherches à faire une telle manip ?

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    Est-ce possible de créer un pointeur dans ma classe "mère" qui pointe sur la donnée d'une classe "feuille"?
    oui mais tu doit bien faire remonter l'info de l'adresse de la classe fille a la classe mere. donc ca oblige la meme syntaxe, le pointeur ne te sert au final que de cache ... cache qui ne sert a rien si ta structure est fixe et que tu peux mettre tes accesseur en inline.

    Et puis aussi, si je suis obligé de faire ça, c'est parce qu'il y a queque chose que je n'ai pas compris dans le langage oo.
    Pas forcement, si je te demandais pourquoi c'est justement pasque c'est la maniere normale de faire, un classe possede ses attibuts et fourni des accesseurs sur ceux-ci, faire autrement reviens vite a briser l'encapsulation des donnees.

    Une solution possible mais qui correspond a un contexte bien particulier serai de partager un gestionnaire de resources entre toutes tes classes ... suite a ca chaque classe peux y enregistrer des paires cle/valeur et tout le monde peux les relire, mais j'insiste sur le fait que c'est tres specifique comme comportement et si c'est juste pour alleger ton ecriture c'est une (tres) mauvaise idee

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Prenons un exemple concret:

    J'ai une classe Ordinateur:
    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
     
    class COrdinateur{
    CMoniteur LeMoniteur;
    CClavier LeClavier;
    CUC UniteCentrale;
    etc...}
    }
     
    class CUC
    {
    CCarteMere LaCarteMere;
    CHD LeDisqueDur;
    CCarteGfx LaCarteGraphique;
    etc...
    }
     
    class CCarteGfx //la crate graphique
    etc...
     
    class CResistance //composant electronique de ma carte graphique
    {
    ...
    }
    imaginons (bon, c'est un peu farfelu, mais c'est pour l'exemple) que dans une methode de COrdinateur, j'ai besoin d'avoir des infos sur une des résistances de la carte graphique.

    Existe-t-til d'autres solutions qu'une imbrication d'agregations?

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    Existe-t-til d'autres solutions qu'une imbrication d'agregations?
    de base je dirais :
    -> programation par resources
    -> base de donnees

    peut etre que quelqu'un aura une autre idee

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Je pense que j'utiliserais la base de registre.

    Ta classe CResistance récupère les infos qu'elle doit connaître. Ensuite elle inscrit ces informations dans la base de registre. Enfin la classe COrdinateur récupére les infos dans cette base.

    C'est une méthode très rapide puisque la base de registre se trouve en mémoire.

    Par contre elle n'est avantageuse que pour de petite quantité d'information (quelques chaînes de caractères et quelques chiffres).

    Pour de plus gros volume d'infos, les fichiers ou les bases de données seront plus adaptées.

    Il faut aussi penser que lorsque la classe COrdinateur veut lire les infos alors la classe CResistance n'est pas en train de les modifier. Si tu ne peux pas empêcher cela tu as les Mutex.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    et si je fait hériter mes classes feuilles de ma classe mère, et que je déclare les variables dont j'ai besoin dans la classe "mère"?

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par r0d
    et si je fait hériter mes classes feuilles de ma classe mère, et que je déclare les variables dont j'ai besoin dans la classe "mère"?
    tu veux vraiment mourrir jeune toi ?

    non plus serieusement si tu fait ca tu aura N instance de la classe mere, chacune ayant de nouveau autant de classes filles, chacune heritant nouveau de la classe mere .... tu voit le probleme

    La base de registre je dit non et ce de maniere generale, ca n'a pas ete prevu pour ca, ce n'est pas portable, ca peux foutre le caillon dans le systeme, ca implique (peut etre) des mutex, et surtout on peux faire exactement la meme chose avec une classe conteneur en singleton

    et la on retombe potentiellement sur un gestion par resources
    et de nouveau si la seule raison est d'eviter d'ecrire du code ... alors c'est une mauvaise raison

  15. #15
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par dok3
    tu veux vraiment mourrir jeune toi ?

    Citation Envoyé par dok3
    non plus serieusement si tu fait ca tu aura N instance de la classe mere, chacune ayant de nouveau autant de classes filles, chacune heritant nouveau de la classe mere .... tu vois le probleme
    ok, je vois
    Citation Envoyé par dok3
    et surtout on peux faire exactement la meme chose avec une classe conteneur en singleton
    et la on retombe potentiellement sur un gestion par resources
    comment fait-on?
    Citation Envoyé par dok3
    et de nouveau si la seule raison est d'eviter d'ecrire du code ... alors c'est une mauvaise raison
    ok. Mais il y a surtout ce problème de conception. Je pense au gars qui va reprendre mon code. Si t'as des lignes de A->getMachin()->getTruc().m_monTableau[A->getIndex()]->getLaVariable()->getLaDonneeDeLaMort()->... le mec qui va lire ça il va devenir dingue!
    Et même pour moi, pour le debuggage, les modifs, etc... c'est quand-même bien d'avoir du code lisible non?

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    ben quoi c'est lisible

    pour faire une classe singleton, cf la recherche du forum, la FAQ et les tuto de loulou24

    apres ca fait quelque chose qui ressemble a ca :

    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
    class SharedData : protected Singleton<SharedData>
    {
         int nbResistanceCarteGraphique_;
     
    public:
        static int nbResistanceCarteGraphique() { return instance.nbResistanceCarteGraphique_; }
        void nbResistanceCarteGraphique(int val) { intance.nbResistanceCarteGraphique_ = val; }
    };
     
    class Ordinateur
    {
        ....
        cerr << SharedData::nbResistanceCarteGraphique() << endl;
        ....
    };
     
    class CarteGraphique
    {
        CarteGraphique() 
        {
            SharedData::nbResistanceCarteGraphique(10);
        }
    };
    (fait a l'arrache)

  17. #17
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    okay!!!
    Si j'ai bien compris, ça consiste à créer une classe "conteneur" dans laquelle on va stocker les données dont on aura besoin dans notre classe "mère". C'est exactement ce que je cherchait en fait )

    MERCI DOK3!!! C'est la Classe...
    (ok je )

  18. #18
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    Et juste une idée comme ca.... En passant par un systeme de Messages ? Genre La classe mere s'enregistre pour recevoir des infos et les info, quand elles sont dispo sont envoyés comme des messages .. ?

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

Discussions similaires

  1. Comment faire remonter des exceptions
    Par specsy dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 02/05/2008, 11h04
  2. Réponses: 16
    Dernier message: 23/06/2006, 17h48
  3. [Debutant] comment faire passer des donnée ???
    Par cyrill.gremaud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/01/2006, 22h28
  4. Réponses: 4
    Dernier message: 03/04/2005, 14h26
  5. Réponses: 5
    Dernier message: 08/03/2004, 10h28

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