:: Enseignements :: Master :: M1 :: 2014-2015 :: Design Pattern ::
[LOGO]

Ca vaut le détour


Ce TD se déroule en autonomie. Les rendus sont à faire sur la plate-forme elearning. Les consignes précises du rendu : Rappel : le travail en autonomie peut inclure des discussions entre vous mais le résultat / le rendu doit être le résultat de VOTRE compréhension.

Exercice 1 - Questions

Les réponses aux questions doivent être faites en 15 minutes maximum (ensuite les rendus ne seront plus possibles) Ne faites pas de copier/coller Wikipedia ! ce qui nous intéresse, c'est votre compréhension et vos mots !

  1. Selon vous, quel est l'avantage principal du design pattern Visitor
  2. Selon vous, quel est l'inconvénient principal du design pattern Visitor
  3. Parcourez la javadoc sur ElementVisitor. Exprimez brièvement votre compréhension.

Exercice 2 - Encore une calculette !

Le but de cet exercice est modifier un code existant permettant d'effectuer le calcul d'une expression en polonaise inverse dans le but de fermer la hiérarchie d'expression tout en laissant la possibilité à un utilisateur d'écrire ses propres traitements.

Le code suivant permet d'évaluer une expression en polonaise inverse
     Iterator<String> it = Pattern.compile(" ").splitAsStream("+ * 4 + 1 1 + 2 3").iterator();
     Expr expr = Expr.parseExpr(it);
     System.out.println(expr);
     System.out.println(expr.eval());
    

  1. Dessiner l'arbre d'expressions créé par le code ci-dessus puis dessiner sur l'arbre l'évaluation de l'expression (c'est-à-dire un appel à la méthode eval()).
    Faite une photo du résultat.
  2. En lisant l'article wikipedia sur le Visitor Pattern (et sa section Java example), modifier le code pour introduire le visiteur ExprVisitor, comme déclaré ci-dessous.
          public interface ExprVisitor {
            public int visitValue(Value value);
            public int visitBinOp(BinOp binOp);
          }
         

    Puis ecrivez une classe EvalExprVisitor qui effectue l'évaluation en utilisant le visitor pattern plutôt que en utilisant la méthode eval.
    Une fois que l'EvalExprVisitor fonctionne, supprimer la méthode eval de l'interface Expr (et des sous classes).
  3. On souhaite faire la même transformation mais avec la méthode toString à la place de la méthode eval. Comme toString retourne une String et pas un int comme eval, il faut paramètré l'interface ExprVisitor par le type de retour comme ceci.
          public interface ExprVisitor<R> {
            public R visitValue(Value value);
            public R visitBinOp(BinOp binOp);
          }
         

    Modifier votre code pour utiliser la version paramètré de l'interface ExprVisitor ci-dessus.
    Vous pouvez utiliser la classe ElementVisitor comme modèle !
    Ecrivez une classe ToStringVisitor qui effectue le même travail que toString puis retirer les méthodes toString une fois que le visiteur marche.
  4. Le toStringVisitor que vous avez écrit (comme les méthodes toString qu'il y avaient précédemment d'ailleurs) n'est pas très efficace car il y a beaucoup de création de String intermédiaire, il serait préférable d'utiliser un seul StringBuilder pour tout le calcul.
    Modifier le ToStringVisitor pour n'utiliser qu'un seul StringBuilder.
    Note: cela veut peut-être dire modifier l'interface ExprVisitor où pas, il y a plusieurs solutions, essayer de venir avec la votre.