:: Enseignements :: Master :: M1 :: 2014-2015 :: Design Pattern ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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 :
- UN seul zip pour l'nsemble des sources + photo UML + readme au format MarkDown + ...
- nommage du zip: NOM_PRENOM-td3b.zip
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 !
- Selon vous, quel est l'avantage principal du design pattern Visitor
- Selon vous, quel est l'inconvénient principal du design pattern Visitor
- 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());
-
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.
-
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).
-
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.
-
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.
© Université de Marne-la-Vallée