Programmation Orientée Objet

Transcription

Programmation Orientée Objet
Programmation Orientée Objet
Bertrand Estellon
Département Informatique et Interactions
Aix-Marseille Université
10 décembre 2013
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
1 / 21
Conversion de dates
La classe suivante permet de représenter des dates :
public class Date {
public int day, month, year ;
public Date(int day, int month, int year) {
this.day = day ; this.month = month ; this.year = year ;
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
2 / 21
Conversion de dates
Nous devons corriger les défauts de la classe suivante :
public class DateConverter {
private String[] frShortMonths = {
"Jan", "Fev", "Mar", "Avr", "Mai", "Jun",
"Jul", "Aou", "Sep", "Oct", "Nov", "Dec"
};
public String dateToString(Date d, String format) {
if (format.equals("fr-slash"))
return d.day+"/"+d.month+"/"+d.year ;
if (format.equals("fr-short"))
return d.day+" "+frShortMonths[d.month-1]+" "+d.year ;
return null ;
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
3 / 21
Conversion de dates
Question 1. Qu’affichent les lignes suivantes :
DateConverter converter = new DateConverter();
Date date = new Date(9,1,2013);
System.out.println(
converter.dateToString(date, "fr-slash"));
System.out.println(
converter.dateToString(date, "fr-short"));
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
4 / 21
Conversion de dates
Question 1. Qu’affichent les lignes suivantes :
DateConverter converter = new DateConverter();
Date date = new Date(9,1,2013);
System.out.println(
converter.dateToString(date, "fr-slash"));
System.out.println(
converter.dateToString(date, "fr-short"));
Réponse.
9/1/2013
9 Jan 2013
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
5 / 21
Conversion de dates
Question 2. Que doit-on modifier pour prendre en charge un nouveau
format (par exemple un format "fr-long" où le mois est écrit en entier et
en français) ? Quels principes SOLID sont violés par le code de la classe
DateConverter ?
Réponse.
▶
Il faut modifier la méthode dateToString pour ajouter un nouveau
“if” pour traiter le nouveau format. Il est également nécessaire
d’ajouter un nouveau tableau.
▶
OCP et SRP (mais il ne faut pas obliger d’expliquer pourquoi et de
donner la défition des deux principes pour avoir la totalité des points.
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
6 / 21
Conversion de dates
Question 3. Proposez le diagramme des classes d’une nouvelle
organisation du code qui corrige ces problèmes de sorte que les lignes
suivantes produisent la même sortie que le code de la question 1 :
DateConverter frSlashConverter
= new FrSlashDateConverter();
DateConverter frShortConverter
= new FrShortDateConverter();
Date date = new Date(9,1,2013);
System.out.println(frSlashConverter.dateToString(date));
System.out.println(frShortConverter.dateToString(date));
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
7 / 21
Conversion de dates
Question 4. Implémentez les classes et les interfaces que vous avez
définies dans le diagramme de la question 3.
public interface DateConverter {
public String dateToString(Date d);
}
public class FrSlashDateConverter implements DateConverter{
public String dateToString(Date d) {
return d.day+"/"+d.month+"/"+d.year ;
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
8 / 21
Conversion de dates
Question 4. Implémentez les classes et les interfaces que vous avez
définies dans le diagramme de la question 3.
public class FrShortDateConverter implements DateConverter {
private String[] frShortMonths = {
"Jan", "Fev", "Mar", "Avr", "Mai", "Jun",
"Jul", "Aou", "Sep", "Oct", "Nov", "Dec"
};
public String dateToString(Date d) {
return d.day+" "+frShortMonths[d.month-1]+" "+d.year ;
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
9 / 21
Conversion de dates
Question 5. Afin de retrouver des fonctionnalités équivalentes au code
proposé en début d’exercice, vous allez écrire le code de la classe
DateUtil de sorte que le code suivante produise la même sortie que le
code de la question 1 :
DateUtil dateUtil = new DateUtil();
Date date = new Date(9,1,2013);
System.out.println(dateUtil.dateToString(date,"fr-slash"));
System.out.println(dateUtil.dateToString(date,"fr-short"));
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
10 / 21
Conversion de dates
public class DateUtil {
private Map<String, DateConverter> converters ;
public DateUtil() {
converters = new HashMap<String, DateConverter>();
converters.put("fr-slash", new FrSlashDateConverter());
converters.put("fr-short", new FrShortDateConverter());
}
public String dateToString(Date date, String format) {
DateConverter converter = converters.get(format);
if (converter==null) return null ;
return converter.dateToString(date);
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
11 / 21
Ensembles d’objets comparables
Deux programmeurs, Bob et Jim, ont écrit deux classes dont nous
n’avons pas les codes sources et qui proposent deux services analogues.
Bob a écrit la classe BobSet<T> qui possède :
▶
un constructeur BobSet(Comparator<T> comp) ;
▶
une méthode void addObject(T obj) qui ajoute l’objet obj ;
▶
une méthode int findObject(T obj) qui retourne la position du
premier objet égal à l’objet obj dans l’ensemble ou -1 si aucun objet
n’a été trouvé.
Jim a écrit la classe JimSet<T> qui possède :
▶
un constructeur JimSet(Comparator<T> comp) ;
▶
une méthode void add(T obj) qui ajoute l’objet obj ;
▶
une méthode boolean contains(T obj) qui retourne true si et
seulement si il existe un objet égal à l’objet obj.
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
12 / 21
Ensembles d’objets comparables
Nous avons écrit l’interface suivante :
public interface MySet<T> {
public void addElement(T obj);
public boolean hasElement(T obj);
}
Les implémentations de l’interface MySet<T> devront faire en sorte que :
▶
la méthode addElement ajoute l’objet obj à l’ensemble ;
▶
la méthode hasElement retourne true si un objet présent dans
l’ensemble est égal à l’objet obj.
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
13 / 21
Ensembles d’objets comparables
Question 1. Proposez un diagramme de classes qui permettent d’utiliser
la classe de Bob ou la classe de Jim en l’adaptant à l’interface MySet<T>.
On doit pouvoir écrire :
public class Main {
public static void main(String[] args) {
Comparator<String> comp = new StrLenComparator();
MySet<String> s = new BobSetAdapter<String>(comp);
/* ou new JimSetAdapter<String>(comp); */
s.addElement("truc"); s.addElement("machin");
System.out.println("bidule:"+s.hasElement("bidule"));
System.out.println("chouette:"+s.hasElement("chouette"));
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
14 / 21
Ensembles d’objets comparables
Question 2. Implémentez les classes BobSetAdapter et JimSetAdapter.
public class BobSetAdapter<T> implements MySet<T> {
private BobSet<T> set ;
public BobSetAdapter(Comparator<String> comparator) {
set = new BobSet<T>(comparator);
}
public void addElement(T obj) { set.addObject(obj); }
public boolean hasElement(T obj) {
return findObject(obj)!=-1 ;
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
15 / 21
Ensembles d’objets comparables
Question 2. Implémentez les classes BobSetAdapter et JimSetAdapter.
public class JimSetAdapter<T> implements MySet<T> {
private JimSet<T> set ;
public BobSetAdapter(Comparator<String> comparator) {
set = new JimSet<T>(comparator);
}
public void addElement(T obj) { set.add(obj); }
public boolean hasElement(T obj) {
return contains(obj);
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
16 / 21
Ensembles d’objets comparables
Question 3. Qu’affiche la méthode main ?
public class Main {
public static void main(String[] args) {
Comparator<String> comp = new StrLenComparator();
MySet<String> s = new BobSetAdapter<String>(comp);
s.addElement("truc"); s.addElement("machin");
System.out.println("bidule:"+s.hasElement("bidule"));
System.out.println("chouette:"+s.hasElement("chouette"));
}
}
Réponse.
bidule:true
chouette:false
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
17 / 21
Ensembles d’objets comparables
Question 4. Joe a également implémenté des services analogues. Il a
choisi de définir une classe JoeSet<T extends Comparable<T>> avec :
▶
un constructeur JoeSet() ;
▶
une méthode void insert(T obj) qui ajoute l’objet ;
▶
une méthode boolean search(T obj) qui retourne true si et
seulement si il existe un objet égal à l’objet obj.
Proposez une implémentation de la classe JoeSetAdapter<T> de façon à
pouvoir utiliser la classe de Joe de la façon suivante :
MySet<String> s = new JoeSetAdapter<String>(comp);
Notez que Joe n’utilise pas de Comparator<T>. Il contraint le type T à
implémenter l’interface Comparable<T> de Java.
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
18 / 21
Ensembles d’objets comparables
public class JoeSetElement<T>
implements Comparable<JoeSetElement<T>> {
private final Comparator<T> comp ;
private T e ;
public JoeSetElement(Comparator<T> comp, T e) {
this.comp = comp ;
this.e = e ;
}
public int compareTo(JoeSetElement<T> obj) {
return comp.compare(e, obj.e);
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
19 / 21
Ensembles d’objets comparables
public class JoeSetAdapter<T> implements MySet<T> {
private Comparator<T> comp ;
private JoeSet<JoeSetElement<T>> joeSet ;
public JoeSetAdapter(Comparator<T> comp) {
this.comp = comp ;
joeSet = new JoeSet<JoeSetElement<T>>();
}
/* ... */
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
20 / 21
Ensembles d’objets comparables
public class JoeSetAdapter<T> implements MySet<T> {
/* ... */
public boolean hasElement(T obj) {
return joeSet.search(new JoeSetElement<T>(comp, obj));
}
public void addElement(T obj) {
joeSet.insert(new JoeSetElement<T>(comp, obj));
}
}
Bertrand Estellon (DII – AMU)
Programmation Orientée Objet
10 décembre 2013
21 / 21