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 Java Discussion :

Patron de conception Visitor Injector en Java, un patron et tutoriel de Yann Caron


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Points : 1 731
    Points
    1 731
    Par défaut Patron de conception Visitor Injector en Java, un patron et tutoriel de Yann Caron
    Bonjour à tous,

    Je vous propose un tutoriel Java intitulé "Tutoriel architectural sur le patron de conception visiteur par injection (ou Visitor Injector)".
    Ce patron de conception vise à contourner le caractère statique du patron Visiteur du Gang of Four par injection de dépendance. L'idée m'en est venue lorsque j'ai réalisé l'analyseur syntaxique que j'ai nommé JASI (qui sera l'objet d'une ouverture des sources très prochainement).

    Pour séparer la syntaxe (l'AST) de l'implémentation (la sémantique), la plupart des parseurs proposent une solution toute trouvée par le Gang Of four : le patron Visiteur. Or celui-ci contient une méthode de visite pour chaque Classe de l'AST. Si, à posteriori, une classe venait à être ajoutée au modèle, la définition du visiteur devrait être modifiée. Dans le cas d'une architecture à plusieurs niveaux, celui-ci devrait être surclassé pour accepter de nouvelles méthodes de visite. Cela engendre des transtypages et des teste de types peu élégants.

    Terrence Parr lui-même propose une solution de contournement dans son livre : Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages. Il y expose un visiteur dans lequel le test de type est effectué lors du parcours en profondeur de l'arbre.

    Grace à ce patron, je propose une solution plus en amont du problème. Le visiteur ne définit plus qu'une méthode générique à tous les types de l'AST. Un tableau associatif (Map en Java) référence toutes les associations Class / Visiteur, et, lors d'un parcours en profondeur préliminaire, les visiteurs associés sont "injecté" aux ASTs traversés. La suite reste inchangée si ce n'est que lors du parcours ce sont les visiteurs injecté qui sont appelés.

    Tout est détaillé ici, suivez le guide ;-)
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 16
    Points
    16
    Par défaut Pourquoi deux parcours ?
    Bonjour,

    Si j'ai bien compris votre proposition, il s'agit d'ajouter un niveau d'indirection (via la classe VisitorInjector et l'injection) pour choisir le bon visiteur. Je ne comprends pas l'intérêt de faire deux parcours : pourquoi l'injection n'est pas faite juste avant l'exécution dans un seul parcours ?

    Merci pour votre réponse

  3. #3
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Points : 1 731
    Points
    1 731
    Par défaut
    C'est tout à fait ça Tlemeu.

    La phase d'indirection est faite dans un premier parcours pour ne pas pénaliser les performances du second.
    En effet, dans le cas d'un interpréteur (AST / Visitor) le choix du visiteur ce retrouverait lors de l'exécution du programme (runtime).

    De plus cela permet de découpler les responsabilité en deux phases, une d'indirection (le choix du comportement) et l'autre d'exécution (l'utilisation du comportement).
    Enfin, il n'est pas rare de parcourir plusieurs fois les même nœuds dans ce genre de problématique. De ce fait, il faudrait à chaque fois tester si le visiteur a déjà été choisi ou non (par lazy initialization). Cela rajoute encore des testes.

    Mais ta remarque est pertinente.
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/10/2013, 17h35
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. [débutant][Conception] Structure dynamique avec Java
    Par blaiseac dans le forum Général Java
    Réponses: 5
    Dernier message: 18/11/2004, 23h00

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