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