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 :

Implémentation alternative d'un visiteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut Implémentation alternative d'un visiteur
    Bonjour à tous,

    J'étais sur le point d'utiliser la version acyclique du design pattern visitor (la version générique proposée par alexandrescu dans "Modern C++ Design-Generic Programming and Design Patterns Applied") cependant comme il ne me convient pas à 100% je cherche quand même une implémentation alternative.

    Avec la version d'alexandrescu (et d'ailleurs avec la plupart des implémentation du DP visitor) je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasse->Accept(monVisitor);
    La problématique étant d'appeler le bon visiteur sur la classe malgré l'utilisation du polymorphisme et la résolution statique des paramètres de fonction.

    Je me demandais donc si je pouvais me passer du double dispatching en récupérant le bon visiteur via une factory, ie. en demandant à l'instance maClasse un identifiant (ex un string donnant le nom de sa classe) qui serait associé dans une std::map à un visiteur.

    En fait ma question n'est pas tant de savoir si c'est faisable mais plutôt si selon vous c'est valable d'un point de vue temps de traitement par rapport au DP visitor acylique qui fait un dynamic_cast et utilise le double dispatching (=> plusieurs appels de fonctions)?

    D'avance merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Une chose est sure, c'est qu'il n'est vraiment pas intéressant d'utiliser une comparaison de chaine de caractères pour travailler: c'est une comparaison qui prend énormément de temps (car, si le seul caractère différent entre deux chaines est le dernier, la comparaison passera par... tous les caractères)

    Une deuxième chose qui est sure, c'est que, si tu veux éviter le double dispatch, tu en arrivera à une situation "bancale" dans laquelle:
    1. tu donnera trop de responsabilité à ta classe "visitée"
    2. tu introduira des dépendances importantes et "mal venues" entre ta classe "visitée" et la classe "visiteuse"
    3. tu multipliera les fonctions dans la classe "visitée", avec, comme résultat, l'obligation de modifier toute la hiérarchie si, d'aventure, tu veux rajouter une manière de la visiter supplémentaire, en contradiction complète avec le principe "Open closed code" (un code doit être "ouvert" à l'évolution, mais "fermé" à la modification)
    Bref, tu l'auras compris: il serait possible d'envisager quelque chose, mais cela me choque à ce point que je n'ai pas envie d'en parler
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut
    Merci pour ta réponse koala01 mais je ne vois pas pourquoi ma proposition d'implémentation va entraîner les 3 défauts que tu cite.
    En effet, mon but est tout le contraire c'est à dire que ma classe visitée ne sache même pas qu'elle va l'être et donc par suite ne connaisse rien de son(ses) visiteur(s).
    Pour moi ça se déroulerait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasseVisitee mcv;
    maFactoryDeVisiteur.visite(mcv);
    et au sein de la fonction "visite()" on aurait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::string id = classeVisitee.getId();
    //création d'une instance du visiteur adéquate via une map associant les identifiants et les visiteurs
    //Visite de la classe
    Ma classe visitée n'a donc nulle besoin d'implémenter la fonction "accept()" et ne connait rien de la classe qui la visite.

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Réponses: 11
    Dernier message: 04/03/2011, 05h04
  3. Réponses: 3
    Dernier message: 12/01/2011, 14h10
  4. Réponses: 1
    Dernier message: 20/07/2007, 10h05
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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