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 :

Code pour pattern adapteur a 2 sens ?


Sujet :

C++

  1. #1
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut Code pour pattern adapteur a 2 sens ?
    Salut les gars !!

    Je cherche a faire un pattern adapteur en C++ a 2 sens entre 2 classes qui contiennent certains attributs plus ou moins equivalents ... Le but est donc de passer les attributs de la classe A et les adapter avec le bon type pour remplir ceux de la classe B et viceversa

    A priori c'est assez simple, mais je cherche a faire un code elegant, innovateur et performant. Quelqu'un a des exemples ou des liens vers des exemples sympas ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    Déjà, tu utilises l'héritage, en déclarant que tes classes A et B découlent d'une troisième classe C qui, elle, contient les attributs communs à A et B. Ensuite, tu définis le constructeur par recopie pour chacune des deux classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A;
    class B;
     
    A::A (const B &);
    B::B (const A &);
    De là, tu pourras faire proprement un instance_de_a = instance_de_b. Tu peux aussi redéfinir l'opérateur « = » pour éviter d'avoir à recréer une nouvelle instance d'un objet juste pour la copier dans l'instance existante, mais ça devient un peu plus sale, et ça dépend beaucoup de la manière dont le compilo gère çà.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Obsidian, ça n'a rien à voir avec le pattern adaptateur, l'intérêt est justement d'adapter une classe à une interface donnée en sachant que tu n'as la possibilité de modifier ni la classe ni l'interface. De fait, mettre en place une hiérarchie est exclut.

    En C++ je pense à deux possibilités:
    - créer des fonctions de conversion ( c'est moyennement bien vu mais les opérateurs de casting sont faits pour ça ). C'est particulièrement adapté si ce sont des value object. Bien entendu, à moins que tes deux classes soient très très similaires, cette conversion sera destructive ( A a1 -> B b -> A a2 : a2 contient moins d'informations que a1 ).
    - la façon orienté objet, créer une implémentation de l'interface A redirigeant vers une instance de B et vice-versa. Est-il nécessaire de préciser que A et B doivent être des interfaces?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Bien que cela soit envisageable, je n'aime pas l'idée d'adapteurs de:
    • A vers B
    • B vers A.

    Qui s'adapte à quoi? Si on touche A ou B il faut faire deux fois le boulot!

    Il me semblerait plus sain de réaliser une classe C qui puisse regrouper certains des attributs communs à A et B puis de créer aussi deux adapteurs mais:
    1. A vers C
    2. B vers C

    On retrouve ce 3ème objet mais la relation entre A, B et C n'est pas l'héritage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    ...En gros j'avais pense a quelquechose de plus exotique mais je ne sais pas trop par ou commencer... je vous explique...

    Mon idee serait de creer des fontions de conversion qui convertissent les attributs de A pour remplir les attributs de B et vice-versa.
    En suite utiliser "mpl" de Boost pour faire du metaprogramming afin de faire appel aux bonnes fonctions lors de l'appel d'une classe unique "convertiseur".
    A cette classe on dit en temps de compilation comment elle devra agir: en tant que convertisseur direct (A->B) ou inverse (B->A)...

    Qu'en pensez vous? c'est realisable? vous connaissez des exemples faciles ?

    Merci

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Je n'ai rien contre "compliquer" mais pour l'instant je ne comprend pas trop pour quoi. Càd,
    • Quels sont les inconvénients des suggestions déjà faites? (Ce que vous ne voulez pas...)
    • Quels sont les avantages attendus motivant de "faire" autrement? (Ce que vous préféreriez).


    Pour l'instant vous nous dites:
    1. "pas assez exotique" - normal, vous vouliez "elegant, innovateur et performant..." et nous radotons les basiques ;-(
    2. "devra effectuer" conversion directe des attributs de A en attributs de B et réciproquement
    3. "pourrait utiliser" la librairie de métaprogramation de boost.


    Pourquoi ne pas poser la question plus clairement: "comment utiliser la MPL de boost pour 'adapter' de façon plus souple *TBD*?"

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Oui, pour ce que vous proposez je suis d'accord et cela me parait clair.

    Je vous pose donc la question que wiztricks suggere... Comment utiliser la MPL donc ?

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/02/2008, 13h10
  2. Réponses: 3
    Dernier message: 29/01/2008, 12h04
  3. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 14h28
  4. Réponses: 2
    Dernier message: 01/04/2003, 22h09
  5. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 11h29

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