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)