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
2018_2019:s3:concprogobjet:td:td4 [2018/10/06 09:20]
blay [Open/Closed ... First Step]
2018_2019:s3:concprogobjet:td:td4 [2018/11/14 14:27]
blay [RENDU]
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
  
 +Pour les S3A date limite de rendu vendredi 16 novembre à 19h
2018_2019/s3/concprogobjet/td/td4.txt · Last modified: 2018/11/14 14:27 by blay