POO – TD/TP 7

Transcription

POO – TD/TP 7
3. Implémentez la version acyclique du patron de conception Visiteur. La
classe PlainPrinter doit construire la chaı̂ne ((b+c)*(a+b)) pour une formule f obtenue de la façon suivante :
POO – TD/TP 7
Variable a = new Variable("a", 0);
Variable b = new Variable("b", 0);
Variable c = new Variable("c", 0);
Formule f = new Produit(new Somme(b,c), new Somme(a,b));
Suite des exercices sur les formules :
La classe XMLPrinter doit construire le document XML suivant (sans l’indentation et les espaces pour simplifier l’implémentation de la classe) :
Nous souhaitons pouvoir afficher les formules sous des formats différents
(XML, Texte, LATEX, etc.). Nous supposons que les classes et l’interface présentes
sur le diagramme suivant sont déjà implémentées. Vous remarquerez qu’aucune
méthode d’affichage n’est proposée sur ce diagramme.
<product>
<sum>
<var>b</var>
<var>c</var>
</sum>
<sum>
<var>a</var>
<var>b</var>
</sum>
</product>
«interface»
Formule
+ evaluer() : double
OperateurNAire
Variable
- name : String
- value : double
- formules : List<Formule>
+ OperateurNAire(formules : Formule[])
+ evaluer() : double
+ getFormules() : List<Formule>
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ Variable(name : String, value : double)
+ evaluer() : double
+ set(v : double)
+ getName() : String
4. Ajoutez une classe RacineCarree au module gérant les formules : cette classe
calcule la racine carrée d’une autre formule. Que doit-on modifier pour que
cette formule soit affichée correctement par tous les visiteurs ?
Produit
Somme
+ Produit(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ Somme(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
5. Ajoutez un nouveau visiteur LaTeXPrinter qui
p affiche les formules en
LATEX. Dans un document LATEX, la formule ((a × b) + (c × d)) s’écrit
$\sqrt{((a \times b) + (c \times d))}$.
6. En TP, essayez de compiler le source LATEX suivant en utilisant la commande
pdflatex et visionner le fichier pdf produit.
\documentclass{article}
\begin{document}
La formule est $\sqrt{((a \times b) + (c \times d))}$.
\end{document}
1. Proposez une implémentation des différents affichages qui ne nous demandent pas de créer de nouvelles classes. Dans quelles classes se situe
le code des méthodes d’affichage ? Est-ce satisfaisant ?
2. Les diagrammes 1 et 2 proposent deux façons de résoudre le problème de
conception identifié à la question précédent. Les méthodes d’affichage sont
regroupées dans des classes séparées appelées Visiteur. Chaque visiteur va
“visiter” les classes qui implémentent l’interface Formule afin de générer
une chaı̂ne de caractères les décrivant. Quelles sont les différences entre les
versions cyclique et acyclique du patron de conception Visiteur ?
7. Ajoutez une méthode write(String nomFichier, Formule f ) à la classe
LaTeXPrinter qui génère un fichier source LATEX contenant la formule f.
Ce fichier doit pouvoir être compilé en utilisant pdflatex.
1
call accept
PlainPrinter
Variable
«interface»
Formule
+ evaluer() : double
+ accept(v : VCFormule)
OperateurNAire
- formules : List<Formule>
- tmp : String
- name : String
- value : double
call visit
+ Variable(name : String, value : double)
+ evaluer() : double
+ set(v : double)
+ accept(f : VCFormule)
+ getName() : String
Produit
+ OperateurNAire(formules : Formule[])
+ evaluer() : double
+ getFormules() : List<Formule>
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ Produit(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ accept(f : VCFormule)
«interface»
VCFormule
call visit
call visit
+ PlainPrinter()
+ visit(v : Variable)
- visit(p : OperateurNAire, symbole : char)
+ visit(s : Somme)
+ visit(p : Produit)
+ executer(f : Formule) : String
+ visit(r : RacineCarree)
+ executer(f : Formule) : String
+ visit(v : Variable)
+ visit(p : Produit)
+ visit(s : Somme)
+ visit(r : RacineCarree)
Somme
XMLPrinter
- tmp : String
+ Somme(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ accept(f : VCFormule)
+ XMLPrinter()
+ visit(v : Variable)
- visit(p : OperateurNAire, operator : String)
+ visit(s : Somme)
+ visit(p : Produit)
+ executer(f : Formule) : String
+ visit(r : RacineCarree)
call accept
Diagramme 1 – Version cyclique
call accept
Variable
- name : String
- value : double
«interface»
Formule
+ evaluer() : double
+ accept(v : VAFormule)
OperateurNAire
- formules : List<Formule>
+ OperateurNAire(formules : Formule[])
+ evaluer() : double
+ getFormules() : List<Formule>
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
«interface»
VAVariable
call visit
+ Variable(name : String, value : double)
+ evaluer() : double
+ set(v : double)
+ getName() : String
+ accept(visitor : VAFormule)
PlainPrinter
+ visit(s : Variable)
- tmp : String
Produit
+ Produit(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ accept(visitor : VAFormule)
Somme
+ Somme(f : Formule[])
# symbole() : char
# evaluerBinaire(a : double, b : double) : double
# evaluerVide() : double
+ accept(visitor : VAFormule)
call visit
«interface»
VAProduit
+ visit(s : Produit)
«interface»
VASomme
call visit
Diagramme 2 – Version acyclique
2
XMLPrinter
- tmp : String
+ visit(s : Somme)
«interface»
VAFormule
+ executer(f : Formule) : String
call accept
+ PlainPrinter()
+ visit(v : Variable)
- visit(p : OperateurNAire, symbole : char)
+ visit(s : Somme)
+ visit(p : Produit)
+ executer(f : Formule) : String
+ visit(r : RacineCarree)
+ XMLPrinter()
+ visit(v : Variable)
- visit(p : OperateurNAire, operator : String)
+ visit(s : Somme)
+ visit(p : Produit)
+ executer(f : Formule) : String
+ visit(r : RacineCarree)