Session 1

Transcription

Session 1
Faculté des Sciences – Aix-Marseille Université – Site Luminy – Session 1 – Décembre 2013 – Durée : 2 heures – SIN5U2TL – Licence 3 Informatique
Examen de PCOO – SIN5U2TL
Question 1. Qu’affichent les lignes suivantes ?
Décembre 2013 – Licence 3 Informatique
Monster monster1 = new Monster(); Monster monster2 = new Monster();
monster1.attack(monster2); monster1.attack(monster2);
System.out.println(monster1+" "+monster2);
monster1.attack(monster2);
System.out.println(monster1+" "+monster2);
monster2.becomeInvincible();
System.out.println(monster1+" "+monster2);
monster2.attack(monster1); monster2.attack(monster1);
monster2.attack(monster1);
System.out.println(monster1+" "+monster2);
Documents autorisés / Calculatrices interdites / Durée de l’épreuve : 2 heures
Exercice 1 : Monstres dans tous leurs états
Considérons la classe suivante :
public class Monster {
private enum State { Dead, Weak, Normal, Invincible }
private State state; private int nbAttacksOrHurts;
private Random random;
public Monster() {
state = State.Normal; nbAttacksOrHurts = 0; random = new Random();
}
Question 2. Que peut-on dire du rôle de l’attribut nbAttacksOrHurts de la classe
Monster ? Est-ce satisfaisant du point de vue de la conception du programme ? Justifiez
votre réponse.
public void attack(Monster monster) {
if (state==State.Weak) { if (random.nextInt(4)==0) monster.hurt(); }
else if (state==State.Normal) { monster.hurt(); }
else if (state==State.Invincible) {
nbAttacksOrHurts++; monster.hurt();
if (nbAttacksOrHurts >= 3) {
nbAttacksOrHurts = 0; state = State.Normal;
}
}
}
Question 3. Donnez la définition du principe OCP et expliquez pourquoi le code de
la classe Monster donné précédemment le viole.
Question 4. Donnez le diagramme de classes d’une nouvelle organisation du code
qui corrige le défaut de conception évoqué à la question précédente. Pour ce faire, vous
devez utiliser le patron de conception state (état) en faisant en sorte que le code donné
à la question 1 continue de fonctionner et produise la même sortie. Notez qu’une seule
instance de la classe Random doit être associée à chaque monstre afin de conserver le
même comportement.
Question 5. Implémentez les classes et les interfaces du diagramme que vous avez
proposé à la question précédente.
public void hurt() {
if (state==State.Weak) { state = State.Dead; }
else if (state==State.Normal) {
nbAttacksOrHurts++; if (nbAttacksOrHurts>=3) state = State.Weak;
}
}
N’oubliez pas de tourner la page...
public void becomeInvincible() {
state = State.Invincible; nbAttacksOrHurts = 0;
}
public String toString() { return ""+state; }
}
1/2
Faculté des Sciences – Aix-Marseille Université – Site Luminy – Session 1 – Décembre 2013 – Durée : 2 heures – SIN5U2TL – Licence 3 Informatique
Exercice 2 : HTML, LaTeX et Visiteurs
Question 1. Qu’affichent les lignes suivantes ?
Considérons l’énumération, l’interface et les classes suivantes :
Element maison = new TextElement("maison");
Element chateau = new TextElement("chateau");
Element habitations = new ListElement(maison, chateau);
System.out.println(habitations.toString(Format.LaTeX));
System.out.println(habitations.toString(Format.HTML));
public enum Format { HTML, LaTeX }
public interface Element { String toString(Format format); }
public class TextElement implements Element {
private String text;
public TextElement(String text) { this.text = text; }
public String toString(Format format) { return text; }
}
Question 2. Écrivez la classe BoldElement de sorte que le code suivant...
public class ListElement implements Element, Iterable<Element> {
private List<Element> elements;
...produise la sortie suivante :
Element maison = new BoldElement(new TextElement("maison"));
System.out.println(maison.toString(Format.LaTeX));
System.out.println(maison.toString(Format.HTML));
\textbf{maison}
<b>maison</b>
public ListElement(Element... elements) {
this.elements = Arrays.asList(elements);
}
Question 3. Que doit-on modifier pour ajouter un nouveau format d’affichage ? Quel(s)
principe(s) SOLID sont violés par les classes écrites jusqu’ici ? Justifiez votre réponse.
public Iterator<Element> iterator() { return elements.iterator(); }
Question 4. Donnez le diagramme de classes d’une nouvelle organisation du code qui
corrige le défaut de conception évoqué à la question précédente. Pour ce faire, vous devez
utiliser le patron de conception visiteur acyclique en faisant en sorte que le code suivant
produise la même sortie que le code de la question 1 :
public String toString(Format format) {
switch (format) {
case HTML:
String html = "<ul>";
for (Element element : elements)
html += "<li>" + element.toString(format) + "</li>";
return html + "</ul>";
case LaTeX:
String latex = "\\begin{itemize}\n";
for (Element element : elements)
latex += "\\item " + element.toString(format)+"\n";
return latex + "\\end{itemize}\n";
default: return null;
}
}
Element maison = new TextElement("maison");
Element chateau = new TextElement("chateau");
Element habitations = new ListElement(maison, chateau);
ElementFormater laTeXFormater = new LaTeXFormater();
System.out.println(laTeXFormater.toString(habitations));
ElementFormater htmlFormater = new HTMLFormater();
System.out.println(htmlFormater.toString(habitations));
Question 5. Implémentez les classes et les interfaces que vous avez définies à la question
précédente sans oublier de préciser les modifications à effectuer dans l’interface Element
et les classes ListElement, TextElement et BoldElement.
}
2/2

Documents pareils