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 :

Simplification de classe


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut Simplification de classe
    Bonjour à tous !
    Histoire de ne pas trainer des lourdeur indéfiniment, je suis entrain d'essyer de remanier certaines partie de mon programme, pour en simplifier le code .

    La je tombe sur mon cEventManager ( une horreur ! )
    C'est une classe, qui possède en gros une seule fonction, qui prend en paramètre un string ( représentant le chemin sur le disque dur, d'un fichier xml décrivant un objet ). Cette fonction, doit

    1) créer une nouvelle instance de l'objet ( une classe dérivé de cEvent )
    2) ajouter cet objet a mon manager de resssources
    3) appeller une méthode Init() sur cet objet, en lui passant en paramètre, le path du fichier le décrivant, ainsi que son Identifiant, retourné par le manager de ressources au moment de l'ajout .

    Pour le moment, j'ai un truc trés moche ( mais fonctionel ) du style

    1) on lit dans le fichier le type de l'objet
    2) on entame une série de if ( type = "valeur")
    3) dans ces if(), on cré un objet correspondant au type

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( type = "Chien")
    {
       ManagerDeRessource.Add("Chien", new cChien() ) ;
    }
    Dans cet exemple, cChien, dérive de cEvent .

    Enfin aprés ma série de if , j'apelle la méthode init()
    ( la pas de problème, car la méthode init() est définit virtuellement dans cEvent )

    Le problème est donc, comment créer mes objet dérivé de cEvent, sans passer par une série de if, qui va tester, quelle objet exactmeent on veux crée ... ( le tout de facons simple si possible )

    EDIT : dernier problème, certain objet sont ajouté ( selon leur type ) par une méthode AddUnique() du manager de ressources, et pas par la méthode Add() courante ...

  2. #2
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    d'apres ce que je comprend de ton probleme tu n'as pas vraiment de choix, parser ton fichier XML va te donner le nom de l'objet a instancier, donc tu es obligé d'appeler le bon constructeur explicitement.

    par contre tu pourrais utiliser un switch plutot qu'une serie de if.

    Pour le AddUnique, tu peux implémenter la methode Add pour les objets specifique qui utilise AddUnique mais l'implémentation au niveau de l'objet appelleras tout simplement AddUnique. Comme çca tu appelles Add sur tout tes objets.

    XXiemeciel

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Le switch sur les string ne fonctionne pas (voir FAQ).
    Pour ton problème:
    http://www.developpez.net/forums/vie...357088#2357088

  4. #4
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Tiens je savais pas que les string ne pouvait pas fonctionner dans les switch, j'avais jamais essayé. Bon a savoir

    Sinon je viens de penser a une solution pour ton probleme

    chacune de tes classes peut contenir une fonction static CreateInstanceOfXXX (CreateInstanceOfChien dans le cas de ton exemple)

    et tu n'a plus qu'a conserver quelquepart une std::map utilisant la string en clef et qui retourne un pointeur de fonction. Sachant que toute tes fonctions vont te retourner un cEvent mais va instancier le bon objet.

    donc dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      string s = monString; //le nom recuperer dans par le parser
     
      pointeurFonction f = maMap[monString]; //pointeurFonction sera defini dans un typedef (regarde la doc sur les pointeurs de fonctions)
     
     cEvent monObjet = f();
    je sais pas si ]ca marche par contre.

    XXiemeciel

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    heu, ca ne me dispense pas de lié le nom/la fonction a un moment, non ?
    En fait, ce n'est pas la lenteur qui me dérange, ( car bon des objets je ne vais aps en charger 200/frames ! ), mais le fait, de, a chaque nouvelle classe, devoir rajouté un if()
    Enfin au pire c'est pas sii grave .... d'autant que au bout d'un moment, je n'en rajouterai surement plus
    Enfin je vais relire l'autre post, histoire de voir si je suis pas passé au travers de quelquechose

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui tu as dû passer à côté de quelque chose, parce qu'en stockant tes fonctions de création dans une table associative style std::map, tu n'as plus tous ces problèmes.

    Relis bien ceci.

  7. #7
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    c'est jsutement l'avantage de la map, le code de creation de tes objets ne changera plus

    fini les rajouts de if a chaque nouvelle classe, juste a prevoir la fonction static d'instanciation de ton objet, pour chaque type d'objet

    XXiemeciel

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    j'ai relus ce post en question, et bien que je suis pas sur d'avoir tout compris au mécanisme de la solution, il me semble qu'il faut tout de même quelquepart lié notre fonction de création avec le string corespondant ( c'est ce que fait Register() dans l'exemple je crois)
    Donc ca reviens a changer les if en une autre ligne de code, indispensable pour cahque nouvelle classe,non?

    (Enfin ... il y a la propable possibilité que j'ai toujours pas comprit comment ca marche ^^ dans ce cas, je vous dirai comment je vois la chose ^^ )

  9. #9
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    non il n'y aura plus de if car faire la registration de ta map ce fait pour tout les cas pas besoin de selectionner.

    c'est sur qu'il va te falloir creer ta map, mais ca c plutot facile a faire et tu le fait une fois.

    XXiemeciel

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    J'ai comprit qu'il n'y aura plus de if
    Mais ca se réume d'une maniére ou d'une autre a , pour chaque nouvelle classe , entrer une instruction .
    Dans le cas de la factory, une entrée dans le map, dans mon cas, un if ... honntement , pour moi ca reviens au même :p ( bon a part que la factory est surement un poil plus propre ^^, je ne compte pas le critère de rapidité car il est négligable dans ce cas )

  11. #11
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Ca revient presque au meme dans ton cas puisque ta classe Register n'est utilisé que dans un cas.

    Maintenant imagine ton probleme a plus grande echelle, dans une application beaucoup plus grosse. plutot que d'aller changer les if dans le code de toute les classes qui utilisent ce systeme, tu as juste a ajouter une seule entree dans ta map.

    Le but sera surtout d'éviter de la duplication de code difficile a maintenir par la suite.

    XXiemeciel

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut Bonjour,
    Si j'ai bien compris, toutes tes classes hériteraient de cEvent ?
    Pourquoi ne pas penser à une map (cf loulou) genre :
    map<string,cEvent*> rep ?

    le string pourrait être un nom unique te permettant de retrouver le cEvent* correspondant. Si ce nom unique n'est pas important, pense à un set.

  13. #13
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut Re: Bonjour,
    Si j'ai bien compris, toutes tes classes hériteraient de cEvent ?
    Pourquoi ne pas penser à une map (cf loulou) genre :
    map<string,cEvent*> rep ?

    le string pourrait être un nom unique te permettant de retrouver le cEvent* correspondant. Si ce nom unique n'est pas important, pense à un set.
    C'est justement à la base de la solution, sauf qu'on stocke des fonctions de création et non des instances.

    Mais ca se réume d'une maniére ou d'une autre a , pour chaque nouvelle classe , entrer une instruction .
    Dans le cas de la factory, une entrée dans le map, dans mon cas, un if ... honntement , pour moi ca reviens au même :p
    La différence est pourtant énorme : sans fabrique, tu dois aller modifier l'implémentation de cEventManager à chaque nouvelle classe, alors qu'avec la solution proposée tu n'y touches plus ; un ajout de classe se fait via un appel de fonction.

  14. #14
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    hum je vois le principe ... je vais y réfléchir un peu et si je me lance la dedans, je vous soumettrai mon code pour voir
    merci a vous !

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Élaboration de classe
    Par il_a_ri dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 16/01/2003, 14h22
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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