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/18 11:00]
blay
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.
  
 +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]]''​.
 +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 ====
  
 +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.1508317227.txt.gz · Last modified: 2017/10/18 11:00 by blay