User Tools

Site Tools


2018_2019:s3:concprogobjet:td:td4

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
2018_2019:s3:concprogobjet:td:td4 [2018/10/06 09:20]
blay [Open/Closed ... First Step]
2018_2019:s3:concprogobjet:td:td4 [2018/10/17 10:34]
blay [Petit pas vers l'intégration]
Line 1: Line 1:
 ====== Open/Closed ... First Step ====== ====== Open/Closed ... First Step ======
 +<note warning>​Du temps sera pris sur la 1e ou la 2e séance sur ce TD (si nécessaire) pour faire des retours sur les précédents rendus.</​note>​
 Ce TD vise à :  Ce TD vise à : 
    - Renforcer votre compréhension de la notion d'​interface et à savoir les utiliser    - Renforcer votre compréhension de la notion d'​interface et à savoir les utiliser
    - Vérifier que vous savez lire des modèles UML réalisés par d'​autres et à les suivre.    - Vérifier que vous savez lire des modèles UML réalisés par d'​autres et à les suivre.
-   - Vous donnez ​quelques éléments de gestion des listes un peu avancé :  les codes vous sont alors donnés, à vous de comprendre. +   - Vous donner ​quelques éléments de gestion des listes un peu avancé :  les codes vous sont alors donnés, à vous de comprendre
-===== Partie : Généralisation =====+ 
 +Un ensemble de codes et conseils vous sont donnés vous permettant de faire "​seul"​ ce TD
 +===== Partie : Généralisation ​& Généricité ​=====
  
 La société //Amadeum// a demandé à un étudiant de gérer les vols, à un autre de gérer les locations de voitures. La société //Amadeum// a demandé à un étudiant de gérer les vols, à un autre de gérer les locations de voitures.
Line 12: Line 14:
 Voici la description plus détaillée du sujet. Voici la description plus détaillée du sujet.
 <​note>​ <​note>​
-1- L'​étudiant recruté devra améliorer les fonctionnalités offertes en permettant, ​dans **une nouvelle classe, ''​ReservationCenter''​** ​de trier une liste de vols en fonction du prix et de pouvoir récupérer uniquement le vol le moins cher parmi un ensemble de vols.+1- L'​étudiant recruté devra améliorer les fonctionnalités offertes en permettant, de trier la liste des vols en fonction du prix et de pouvoir récupérer uniquement le vol le moins cher.
  
 2- Nous aimerions qu'il puisse également gérer les locations de voitures ​ : trier des locations en fonction du prix et de pouvoir récupérer uniquement la location la moins chère parmi un ensemble de locations. 2- Nous aimerions qu'il puisse également gérer les locations de voitures ​ : trier des locations en fonction du prix et de pouvoir récupérer uniquement la location la moins chère parmi un ensemble de locations.
- 
  
 Il est important de prendre en compte que si les codes existants peuvent être modifiés, les tests associés doivent continuer à fonctionner ce code ayant déjà été intégré dans d'​autres applications. ​ Il est important de prendre en compte que si les codes existants peuvent être modifiés, les tests associés doivent continuer à fonctionner ce code ayant déjà été intégré dans d'​autres applications. ​
Line 22: Line 23:
 **Votre défi** ​ : faire tout ce que demande votre employeur en étant "​malin"​ et un bon développeur. Vous avez le droit de modifier les codes qui vous sont donnés. **Votre défi** ​ : faire tout ce que demande votre employeur en étant "​malin"​ et un bon développeur. Vous avez le droit de modifier les codes qui vous sont donnés.
  
-<note warning> 
-Dans l'​idéal nous aimerions avoir les mêmes fonctionnalités pour la gestion des nuits d'​hôtels,​ seulement nous ne disposons pour ce problème que de codes partiels. ​ 
-</​note>​ 
  
  
 Voici les codes associés. Voici les codes associés.
-{{:2017_2018:​s3:​concprogobjet:​td:​openclosedprinciplev0withtests2.jar|}}+{{:2018_2019:​s3:​concprogobjet:​td:​archive.zip|}}
  
-<note tip>Pour trier  :  
-Collections.sort... et des exemples par exemple: https://​www.mkyong.com/​java8/​java-8-lambda-comparator-example/​ 
-</​note>​ 
  
 Attention, cette fois-ci vous devez chercher seul à résoudre le problème, mais voici quelques pistes :  Attention, cette fois-ci vous devez chercher seul à résoudre le problème, mais voici quelques pistes : 
Line 38: Line 33:
   - Avez-vous compris ce qui est attendu de vous ? Vous n'avez pas droit à la question, "​qu'​est-ce que je fais? " ... sous toutes ses formes!((Reprenez la description détaillée ci-dessus et dessinez/​écrivez votre compréhension des questions en faisant référence à vos classes)).   - Avez-vous compris ce qui est attendu de vous ? Vous n'avez pas droit à la question, "​qu'​est-ce que je fais? " ... sous toutes ses formes!((Reprenez la description détaillée ci-dessus et dessinez/​écrivez votre compréhension des questions en faisant référence à vos classes)).
   - Avez-vous bien identifié tous les éléments? Le couplage? Vous vous rappelez du principe ouvert/​fermé?​ de la ségrégation des interfaces?   - Avez-vous bien identifié tous les éléments? Le couplage? Vous vous rappelez du principe ouvert/​fermé?​ de la ségrégation des interfaces?
-  ​- OK vous pouvez implémenter puisque vous avez une bonne idée de votre "​modèle"​ de l'​application. +       - Qui a-t-il de commun entre les fonctionnalités demandées ? Qui a-t-il de commun entre un vol et une location de voitures? Qui a-t-il de commun entre les services existants? ​ Que pouvez-vous faire pour généraliser?​ 
-===== Petit pas vers l'​intégration =====+  ​- OK vous pouvez implémenter puisque vous avez une bonne idée de votre "​modèle"​ de l'​application(( 
 +<​code>​
  
-Amadeum a imaginé d'​étendre ses compétences en offrant un service de préparation aux voyages "​TravelOrganizer"​ "Low cost" qui, à partir d'une description,​ vous propose des voyages+import java.util.ArrayList;​ 
 +import java.util.Comparator;​ 
 +import java.util.List;​
  
-{{:​2017_2018:​s3:​concprogobjet:​td:​openclosed_2017-10-13_a_21.24.00.png?​500|}}+public ​ class Service<​T extends PayingItem>​{ 
 + protected List<​T>​ payingItemList = new ArrayList<>​();​
  
 + public Service(List<​T>​ payingItemList) {
 + this.payingItemList = payingItemList;​
 + }
  
-L'​ingénieur en charge du projet a conçu le diagramme suivant et commme il est très content de vous, il s'​attend à ce que :  + protected ​ List<​T>​ getpayingItemList(){ 
-   - vous le codiez, + return payingItemList;​ 
-   - vous récupériez tous les codes existants et que vous les intégriez pour offrir de nouveaux services, i.e. que vous pouvez à présent créer des "​Trip"​ qui sont l'​assemblage de "​flights"​ et "​CarRentals"​+
-   - vous testiez vos codes.+  
 + public List<​T>​ sortedByPrice() { 
 + payingItemList.sort(Comparator.comparing(PayingItem::​getPrice));​ 
 + return payingItemList;​ 
 +
 +  
 + public T lessExpensiveItem(){ 
 + sortedByPrice();​ 
 + return payingItemList.get(0); 
 +
 +
  
-Pour vous aider :  + public ​void add(T payingItem) { 
-  * Un voyage (''​Trip''​) correspond à un vol (le moins cher qui vous amène à destination le jour voulu), une location de voiture sur place (pour la durée de votre séjour) et éventuellement des nuits d'​hôtels si vous l'avez implémenté. + payingItemList.add(payingItem);
-  * ''​Find''​ renvoie l'Item le moins cher : Par exemple, un vol ou une location de voiture qui correspond à la description (même date, durée attendue, point de départ, point d'​arrivée). +
-  * Attention, vous avez peut etre un probleme pour le ''​find''​ dans ''​CarRentalService''​. En effet, pour obtenir des ''​CarRental''​ actuellement il est nécessaire de réserver la voiture (''​book''​). Or vous ne voulez récupérer qu'une seule location de voiture, et la moins chère, d'où les solutions possibles suivantes :  +
-        * Comme il s'agit d'un simple TD, vous pouvez ne louer que la voiture la moins chère en partant du principe que le prix sera proportionnel (indépendamment de la durée); +
-        * Vous louez toutes les voitures, ce qui n'est pas très réaliste, mais ce n'est qu'un TD... +
-        * Vous redéfinissez une fonction de tri dans le service qui utilise une fonction de calcul de prix à partir du prix de la voiture et de la durée. +
-  * Un exemple de code pour createATrip +
-<code java> +
-public ​Trip createATrip(Description d) { +
- Trip trip = new Trip(d); +
- services.forEach(service ->  +
- {trip.addItem(service.find(d));} ); +
- return trip;+
  }  }
 +
 +}
 </​code>​ </​code>​
-===== Classe abstraite comme un moyen d'​intégration (facultatif) ===== 
  
-A votre demande, voici l'​exemple ​du cours sur les portes revisités sur l'​exemple des avions qui ont un prix qui change dynamiquement.+et pour l'utiliser par exemple ​:  
 +<​code>​ 
 +public class CarRentalService extends Service<​CarRental>​ { 
 +</​code>​
  
-==== Timer et TimerTask ​====+Si besoin voici une visualisation de la solution (on voit mal cependant la relation entre Service générique et réalisé. A noter que pour cela j'ai utilisé l'​outil : [[https://​marketplace.eclipse.org/​content/​objectaid-uml-explorer#​group-metrics-tab|ObjectAid]] 
 +{{ :​2018_2019:​s3:​concprogobjet:​td:​v1_services_2018-10-06_a_20.01.45.png?​direct&​100 |}} 
 +)). 
 +===== Petit pas vers l'​intégration =====
  
-Pour pouvoir utiliser ​un timer qui déclenche ​une action à temps fixe, vous pouvez utiliser la classe ''​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Timer.html|Timer]]''​+Amadeum a imaginé d'​étendre ses compétences en offrant ​un service de préparation aux voyages "​TravelOrganizer"​ "Low cost" ​qui, à partir d'une description, vous propose des voyages.  
-Celle-ci ​fait référence à la classe abstraite ''​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​TimerTask.html|TimerTask]]''​.+Ce travail a été fait sans rien savoir de ce qui précèdeDonc vous allez devoir vous adapter.
  
-Il est alors possible par la méthode ''​scheduleAtFixedRate(TimerTask task, long delay, long period)''​ +{{ :​2018_2019:​s3:​concprogobjet:​td:​travelorganiser_2018-10-06_a_23.13.43.png?​direct&​300 |}}
-d'​exécuter une tâche spécifique de façon répété à temps fixe, en commençant après un temps spécifique.+
  
-Voici un exemple de code qui définit une classe qui étend ​ ''​TimerTask''​ et chaque fois qu'​elle est exécutée modifie le prix qui lui est associé. Une classe qui contient un "​main"​ vous montre comment utiliser ce code. ''​PayingItem''​ correspond à une interface qui définit une unique méthode ''​getPrice''​. 
-{{:​2017_2018:​s3:​concprogobjet:​td:​timer.jar|Code à charger }} 
  
-  - Modéliser les classes correspondant à ces quelques lignes ​de codes  +L'​ingénieur en charge du projet a conçu le diagramme suivant et commme il est très content ​de vous, il s'​attend à ce que :  
-  Comprenez les relations entre ces classes en regardant ​le ''​main''​ et comprenez ​les codes.+   ​vous le codiez //(La classe ​''​CarRentalService'' ​doit implémenter ''​Service'',​ mais il n'est pas exigé que ce soit une implémentation directe de ''​Service''​)//​ 
 +   - vous récupériez tous les codes existants ​et que vous les intégriez pour offrir de nouveaux services, i.e. que vous pouvez à présent créer des "​Trip"​ qui sont l'​assemblage de "​flights"​ et "​CarRentals"​. 
 +   - vous testiez vos codes.
  
-==== Utilisation de ces classes ==== +Pour vous aider :  
-A votre tour d'utiliser ces classes pour définir une méthode ​qui renvoie ​non plus un vol qui un prix fixe mais un prix qui varie : ''​public PayingItem findMovingItem(Description d)''​. ​Notez que le prix varie sans que le type de retour ne donne cette indication.+  * Un voyage (''​Trip''​) correspond à un vol (le moins cher qui vous amène à destination le jour voulu), une location de voiture pour la durée de votre séjour. 
 +  * ''​Find'' ​renvoie ​l'Item le moins cher : Par exemple, ​un vol ou une location de voiture ​qui correspond à la description (même date, durée attendue, point de départ, point d'​arrivée). 
 +  * Attention, vous avez peut etre un probleme pour le ''​find''​ dans ''​CarRentalService''​. En effet, pour obtenir des ''​CarRental''​ actuellement il est nécessaire de réserver la voiture ​(''​book''​)Or vous ne voulez récupérer qu'une seule location de voiture, et la moins chère, d'où les solutions possibles suivantes :  
 +        * Comme il s'agit d'un simple TD, vous pouvez ne louer que la voiture la moins chère en partant du principe ​que le prix sera  
 +        * Vous redéfinissez une fonction ​de sélection...
  
-Pour tester votre code vous pouvez par exemple réutiliser les codes suivants.+===== Facultatif =====
  
-Pour initialiser. +Ajouter ​la réservation ​de nuitées dans les hôtels.
-<​code>​ +
- @Before +
- public void setUp() throws Exception { +
- flights = new ArrayList<>​();​ +
- flight = new Flight(20, LocalDate.of(2017,​ 8, 1), LocalTime.of(8,​ 30), "​Nice",​ "​Paris"​);​ +
- flight1 = new Flight(10, LocalDate.of(2017,​ 8, 1), LocalTime.of(9,​ 30), "​Nice",​ "​Paris"​);​ +
- flight2 = new Flight(30, LocalDate.of(2017,​ 8, 1), LocalTime.of(10,​ 30), "​Nice",​ "​Paris"​);​ +
- flights.add(flight);​ +
- flights.add(flight1);​ +
- flights.add(flight2);​ +
- fs = new FlightService(flights);​ +
-+
-</​code>​ +
- +
-Pour le test lui-même. +
-<​code>​ +
-@Test +
- public void testFindMovingItem() { +
- Description d = new Description(LocalDate.of(2017,​ 8, 1), "​Nice",​ "​Paris",​ 2); +
- Flight f = (Flight) fs.findMovingItem(d);​ +
- // Test pour une nouvelle boucle for utilisant un forEach +
- IntStream.range(1,​ 5).forEach(i -> { +
- try { +
- // Pour visualiser que le prix change bien. +
- // Il est difficile de le definir spus la forme d'​Asset +
- // car on ne sait pas combien ​de fois le ratio a eu le temps de s'​appliquer +
- // L'​attente permet à la tache en arrière plan de s'​exécuter +
- System.out.println(i + " : ===> Price :" + f.getPrice());​ +
- Thread.sleep(200);​ +
- System.out.println(i + " : ===> Price has changed :" + f.getPrice());​ +
- } catch (InterruptedException ex) { +
- ex.printStackTrace();​ +
-+
- System.out.println(i);​ +
- }); +
-+
-</​code>​ +
- +
- +
- +
-Si vous avez du mal, voici le code, mais éviter de le regarder sans avoir au moins essayé de le faire seul "à votre propre sauce"​. +
- +
- +
-<​code>​ +
- public PayingItem findMovingItem(Description d) { +
- ArrayList<​Flight>​ matchingFlights = getFlights(d.getDepartDate(),​d.getDepartPlace(),​d.getArrivalPlace());​ +
- PayingItem x = PayingItemTools.cheapestItem((matchingFlights));​ +
- ChangingPriceTask timerTask = new ChangingPriceTask( (ChangingPayingItem) x, 5.0); +
- Timer timer = new Timer(true);​ +
- timer.scheduleAtFixedRate(timerTask,​ 0, 190); +
- return x; +
-+
-</​code>​+
  
 ==== RENDU ==== ==== RENDU ====
  
 Code + modèles et remarques éventuelles. Code + modèles et remarques éventuelles.
-Les modèles peuvent correspondre à des diagrammes dessinés à la main, ou obtenu ​par reverse mais dans ce cas, ils sont "​propres"​ au sens où les informations essentielles y sont représentées et seulement celles-ci.+Les modèles peuvent correspondre à des diagrammes dessinés à la main, ou obtenus ​par reverse mais dans ce cas, ils sont "​propres"​ au sens où les informations essentielles y sont représentées et seulement celles-ci.
 http://​jalon.unice.fr/​cours/​blay/​Cours-blay-20150930110548/​BoiteDepot-blay-20171020224642543829?​tab=deposit http://​jalon.unice.fr/​cours/​blay/​Cours-blay-20150930110548/​BoiteDepot-blay-20171020224642543829?​tab=deposit
  
2018_2019/s3/concprogobjet/td/td4.txt · Last modified: 2018/11/14 14:27 by blay