User Tools

Site Tools


2017_2018:s3:concprogobjet:td:td5

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
2017_2018:s3:concprogobjet:td:td5 [2017/10/20 22:22]
blay [Classe abstraite comme un moyen d'intégration]
2017_2018:s3:concprogobjet:td:td5 [2017/10/27 12:14] (current)
blay [Classe abstraite comme un moyen d'intégration]
Line 8: Line 8:
  
  
 +<note important>​En fait il nous aura fallu 4h</​note>​
 ===== Partie : Généralisation ===== ===== Partie : Généralisation =====
  
Line 46: Line 46:
 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,
-   - 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 "CarRental".+   - 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.
  
-===== Classe abstraite comme un moyen d'​intégration =====+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é. 
 +  * ''​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>​ 
 +===== 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. 
 + 
 +===Timer et TimerTask ​====
  
 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]]''​. 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]]''​.
Line 58: Line 78:
  
 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''​. 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 ​}}
-{{:​2017_2018:​s3:​concprogobjet:​td:​timer.jar|}}+
  
   - Modéliser les classes correspondant à ces quelques lignes de codes    - Modéliser les classes correspondant à ces quelques lignes de codes 
-  - Comprenez les relations entre ces classes en regardant le main et comprenez les 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"​. 
  
-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.+<​code>​
  public PayingItem findMovingItem(Description d) {  public PayingItem findMovingItem(Description d) {
  ArrayList<​Flight>​ matchingFlights = getFlights(d.getDepartDate(),​d.getDepartPlace(),​d.getArrivalPlace());​  ArrayList<​Flight>​ matchingFlights = getFlights(d.getDepartDate(),​d.getDepartPlace(),​d.getArrivalPlace());​
- PayingItem x = PayingItemTools.lessExpensiveItem((matchingFlights));​+ PayingItem x = PayingItemTools.cheapestItem((matchingFlights));​
  ChangingPriceTask timerTask = new ChangingPriceTask( (ChangingPayingItem) x, 5.0);  ChangingPriceTask timerTask = new ChangingPriceTask( (ChangingPayingItem) x, 5.0);
  Timer timer = new Timer(true);​  Timer timer = new Timer(true);​
Line 73: Line 141:
  return x;  return x;
  }  }
 +</​code>​
  
 +==== RENDU ====
  
 +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. 
 +http://​jalon.unice.fr/​cours/​blay/​Cours-blay-20150930110548/​BoiteDepot-blay-20171020224642543829?​tab=deposit
  
2017_2018/s3/concprogobjet/td/td5.1508530936.txt.gz · Last modified: 2017/10/20 22:22 by blay