S3 : Conception et Programmation Objet Avancées
-
-
- Attention pensez au rendu de fin de module
-
La société Amadeum a demandé à un étudiant de gérer les vols, à un autre de gérer les locations de voitures. Elle vous prend en stage et voici le sujet de stage : “Améliorer la gestion des items liés aux voyages”.
Voici la description plus détaillée du sujet.
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.
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.
Voici les codes associés. openclosedprinciplev0withtests2.jar
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.
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 :
Pour vous aider :
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).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 : public Trip createATrip(Description d) { Trip trip = new Trip(d); services.forEach(service -> {trip.addItem(service.find(d));} ); return trip; }
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.
Pour pouvoir utiliser un timer qui déclenche une action à temps fixe, vous pouvez utiliser la classe Timer
.
Celle-ci fait référence à la classe abstraite 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
.
Code à charger
main
et comprenez les codes.
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.
@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); }
Pour le test lui-même.
@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); }); }
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”.
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 + 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