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 18:07]
blay [Partie : Généralisation]
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
Line 26: Line 26:
  
 Voici les codes associés. Voici les codes associés.
-{{:2017_2018:​s3:​concprogobjet:​td:​openclosedprinciplev0withtests2.jar|}}+{{:2018_2019:​s3:​concprogobjet:​td:​archive.zip|}}
  
  
Line 33: 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?
-       - 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 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?
   - OK vous pouvez implémenter puisque vous avez une bonne idée de votre "​modèle"​ de l'​application((   - OK vous pouvez implémenter puisque vous avez une bonne idée de votre "​modèle"​ de l'​application((
 <​code>​ <​code>​
Line 69: Line 69:
 } }
 </​code>​ </​code>​
 +
 +et pour l'​utiliser par exemple : 
 +<​code>​
 +public class CarRentalService extends Service<​CarRental>​ {
 +</​code>​
 +
 +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 ===== ===== Petit pas vers l'​intégration =====
  
 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. ​ 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. ​
 +Ce travail a été fait sans rien savoir de ce qui précède. Donc vous allez devoir vous adapter.
  
-{{:2017_2018:​s3:​concprogobjet:​td:​openclosed_2017-10-13_a_21.24.00.png?500|}}+{{ :2018_2019:​s3:​concprogobjet:​td:​travelorganiser_2018-10-06_a_23.13.43.png?direct&​300 ​|}}
  
  
 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 :  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 : 
-   - vous le codiez,+   - 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 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.    - vous testiez vos codes.
  
 Pour vous aider :  Pour vous aider : 
-  * 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é.+  * 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).   * ''​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 :    * 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); +        * 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 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 sélection...
-        * 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>​ +
-===== 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.+===== Facultatif =====
  
-==== Timer et TimerTask ==== +Ajouter ​la réservation ​de nuitées dans les hôtels.
- +
-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]]''​. +
-Celle-ci fait référence à la classe abstraite ''​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​TimerTask.html|TimerTask]]''​. +
- +
-Il est alors possible par la méthode ''​scheduleAtFixedRate(TimerTask task, long delay, long period)''​ +
-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  +
-  - Comprenez les relations entre ces classes en regardant le ''​main''​ et comprenez les codes. +
- +
-==== Utilisation de ces classes ==== +
-A votre tour d'​utiliser ces classes pour définir une méthode qui renvoie non plus un vol qui a 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. +
- +
-Pour tester votre code vous pouvez par exemple réutiliser les codes suivants. +
- +
-Pour initialiser. +
-<​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