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

Langage C++ Discussion :

chargement dynamique de namespace


Sujet :

Langage C++

  1. #1
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut chargement dynamique de namespace
    Bonjour à toutes et à tous,

    je fais depuis ce matin quelques recherches et tests avec les namespaces C++ auquels je n'avais jamais touché jusqu'à maintenant.
    Ma problématique est simple, j'aurai à terme des class du même nom d'où l'utilisation de namespace.
    Chacun de ces namespaces sera appelé sans intéraction avec les autres, un peu comme deux applications totalement différentes mais compilées en une.

    J'ai donc fait quelques tests pour un point d'entrée conditionnel.
    Voici ce qu'il est possible de faire dans un premier temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void exec(string name){
      if( name == "foo" ){
        using namespace foo;
        someClass::exec();
      }else{
        using namespace bar;
        someClass::exec();
      }
    }
    Le code étant simplifié pour l'exemple, mais j'aurai à terme des milliers de lignes à la place de l'appel à someClass::exec(). Or à cause de cette déclaration de namespace il va me falloir dupliquer le même code !
    Je précise que je ne veux pas préfixer mes appels par le namespace, c'est pas le but de tout réécrire justement.

    J'ai réfléchi à tout ce qui me passait par la tête, constante (mais évalué à la compilation donc pas bon), variable (passe pas dans un using namespace), sans trouver mieux que ce que j'ai posté.

    Auriez-vous une méthode autre que celle là qui pourrait me statisfaire ? Ou une autre façon de traiter ce problème ?

    Cordialement,
    xTG.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Tu peux rendre ta fonction template, en prenant en parametre soit foo::someClass, soit bar::someClass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    namespace{
    template <class someClass>
    void exec_inner(string name){
        someClass::exec();
    }
    };
     
    void exec(string name){
      if( name == "foo" ){
        exec_inner<foo::someClass>(name);
      }else{
        exec_inner<bar::someClass>(name);
      }
    }
    Sinon, tu peux te tourner du coter des librairies dynamiques
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par transgohan Voir le message
    Auriez-vous une méthode autre que celle là qui pourrait me statisfaire ? Ou une autre façon de traiter ce problème ?
    2 dlls (ou l'équivalent selon ton OS).

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Merci pour vos réponses.
    Finalement cette partie de mes réflexions a été jeté.
    Mon chef préfère des fichiers à rallonge à coup de if que des codes qui pourraient ne pas être compris par des futurs stagiaires...
    Je m'intérroge tout de même, ce serait quoi pour un stagiaire le plus difficile à comprendre ? Un appel de code asm ou bien l'utilisation d'un namespace ?

    Concernant les librairies dynamiques je me suis renseigné, on ajoute tout de même beaucoup de complexité pour pas grand chose. En plus j'ai cru lire dans le lot de documents que j'ai parcouru ce matin que cela apportait aussi un temps de chargement non négligeable à l'application, chose qui ne m'avantage guère étant sur un système temps réel.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Et oui, c'est l'avantage d'un patron, préférer la prise en main par le futur stagiaire, mais exiger les performances...

    Un gros if(soft==soft1) loadLibrary("dll1"); else loadLibrary("dll2");, ca ne suffit pas?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par leternel Voir le message
    Un gros if(soft==soft1) loadLibrary("dll1"); else loadLibrary("dll2");, ca ne suffit pas?
    Et dans le cas où les deux peuvent avoir à être chargées ?
    Mon problème n'est pas un chargement exclusif justement, j'ai simplifié à l'extrème le problème présenté. Mais pource que j'en comprends c'est pas les librairies dynamiques qui vont remplacer les namespaces.
    Mais bon, l'argument ressorti était aussi qu'il veut pas de fichiers qui se baladent à côté du binaire donc la question est close.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Dans ce cas, have fun et bon courage!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il n'y a aucune résolution dynamique de noms en C++. Que ce soit avec les namespaces ou d'une autre manière. Donc il te faut jouer sur la duplication de code.

    Une technique en utilisant le préprocesseur qui évite d'avoir à dupliquer les sources:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fichier A
    using namespace Foo;
    #include "Impl.inc"
     
    // fichier B
    using namespace Bar;
    #include "Impl.inc"
    Le faire avec des templates est vraisemblablement possible, mais ça risque d'être lourd.

    Jouer avec les libs dynamiques. Peut-être. À condition qu'il n'y ait pas d'inline ni d'autres dépendances sur l'implémentation (comme par exemple la création d'un objet sur la pile; en fait même l'allocation dynamique d'un objet va poser problème, le résultat va dépendre de la taille, il vaut déléguer ça aussi à la lib dynamique).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Une technique en utilisant le préprocesseur qui évite d'avoir à dupliquer les sources:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fichier A
    using namespace Foo;
    #include "Impl.inc"
     
    // fichier B
    using namespace Bar;
    #include "Impl.inc"
    Hum pas sûr de comprendre où vous voulez en venir.
    Le but est de créer trois fichiers dans votre exemple non ?
    L'un avec le code : Impl.inc
    Un autre avec le namespace Foo et l'inclusion de Impl.inc
    Et le dernier avec le namespace Bar et l'inclusion de Impl.inc
    Mais j'avoue ne pas du tout voir ce que je dois faire avec ces deux fichiers par la suite.

    Est-ce ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void exec(string name){
      if( name == "foo" ){
        using namespace foo;
        #include "someClass.cpp"
      }else{
        using namespace bar;
        #include "someClass.cpp"
      }
    }
    (Pas les moyens de tester et rien trouvé dans la litterature pouvant s'y rapprocher pour me mettre sur la piste de la compréhension.)

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Hum pas sûr de comprendre où vous voulez en venir.
    Le but est de créer trois fichiers dans votre exemple non ?
    L'un avec le code : Impl.inc
    Un autre avec le namespace Foo et l'inclusion de Impl.inc
    Et le dernier avec le namespace Bar et l'inclusion de Impl.inc
    Mais j'avoue ne pas du tout voir ce que je dois faire avec ces deux fichiers par la suite.

    Est-ce ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void exec(string name){
      if( name == "foo" ){
        using namespace foo;
        #include "someClass.cpp"
      }else{
        using namespace bar;
        #include "someClass.cpp"
      }
    }
    (Pas les moyens de tester et rien trouvé dans la litterature pouvant s'y rapprocher pour me mettre sur la piste de la compréhension.)
    Par exemple. (Je suis loin d'être sûr que je travaillerais à ce niveau de granularité là, mais l'idée y est).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Ah bah je viens d'apprendre quelque chose, je pensais naïvement que l'include était réservée pour les fichiers d'entêtes.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  12. #12
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Yavait pas un moyen d'importer une fonction d'un namespace à un autre?


    Un truc genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace A
    {
         void truc();
    }
     
    namespace B
    {
         using A::truc();
    }
    Ca peut pas aider ça? Tu l'écris une fois, tu l'importe dans les namespaces qui sont similaires, tout ça compile-time bien sur.

    A vérifier si ça fais bien ce que je pense.

  13. #13
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Pas suivi ce que tu voulais mettre en évidence là.
    Tu définis la fonction truc() dans le namespace B qui redirige en fait vers la fonction du namespace A.
    C'est bien ça ?
    Si j'ai compris le fonctionnement mon raisonnement lui ne va pas plus loin et je vois pas où tu voulais en venir.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

Discussions similaires

  1. [jar]chargement dynamique.
    Par Teddy-htk dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/04/2006, 15h19
  2. [tomcat]chargement dynamique de classes depuis une webapp
    Par alphamax dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/03/2004, 09h59
  3. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  4. Dll a chargement dynamique
    Par delire8 dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/06/2003, 22h47
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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