:: Enseignements :: ESIPE :: E4INFO :: 2018-2019 :: Programmation Orientée Objet - Design Patterns ::
[LOGO]

Passe ton bac


Ce TD se déroule en autonomie (par binome). Les rendus sont à faire sur la plate-forme elearning. Les consignes précises du rendu : Rappel : le travail en autonomie peut inclure des discussions entre vous mais le résultat / le rendu doit être le résultat de VOTRE compréhension.

Exercice 1 - Questions

Les réponses aux questions doivent être faites en 15 minutes maximum (ensuite les rendus ne seront plus possibles) Ne faites pas de copier/coller Wikipedia ! ce qui nous intéresse, c'est votre compréhension et vos mots !

  1. Donnez votre définition d'une "static factory" et votre définition d'une "factory method".
  2. Qu'ont en commun les méthodes du JDK suivantes :
  3. Y'a-t-il des cas où l'usage du Singleton est recommandé ?

Exercice 2 - Des bacs et des camions

On est en train de préparer la refonte du SI de tous les bacs de Normandie, permettant de traverser la Seine.
Une des équipes travaille sur les tarifs, pour inciter les transporteurs à utiliser des convois (un ensemble de véhicules) qui optimisent l'utilisation des bacs, d'un point de vue écologique et économique. C'est un sujet compliqué dont on ne s'occupe pas !
Notre équipe est chargée de concevoir le logiciel qui aidera les transporteurs à concevoir les convois les plus économiques pour eux, et donc les plus optimisés pour nous.
Dans tout l'exercice, nous ignorons volontairement ce qui touche au volume et nous ne nous intéresserons qu'au poids.
Le but de cet exercice est donc de concevoir ce logiciel.

  1. Pour commencer, nous allons écrire la fonction qui permet de constituer un convoi (i.e. une liste de camions) à partir d'un fichier de description. Ces fichiers contiennent la description d'un camion sur chaque ligne, avec la couleur du camion et le poids total transportable (maxWeight).
    Exemple : truck blue 3000
    Ecrire la méthode List<Truck> createConvoy(Path path) dans une classe Main du package fr.umlv.vehicle.
    Exemple de fichier de description de convoi:

    On rappelle que Files.lines(path) permet d'extraire toutes les lignes d'un fichier une par une.
  2. Pour calculer le prix à payer, écrire long computeTax(List<Truck> convoy)
    chaque camion sera en charge de donner le montant de la taxe, par un calcul (pour l'instant) extrèmement simple :
    poids max / 100, à donner en centimes.

Exercice 3 - et les Motos ?

On avait oublié un "petit" détail : un convoi peut aussi être constitué avec des motos ou des autos.

Exercice 4 - Factory ?


Exercice 5 - Adaptons !

"On" ne nous avait pas tout dit ... en fait, dans le fichier de description, il n'y aura pas de poids max pour les motos et il y aura une information supplémentaire pour les voitures : le nombre de personnes transportées.
Pour les voitures, la taxe est alors de 10 euros par personne transportée.
Le nombre de personnes transportées pour les motos sera toujours de 1 (non indiqué dans le fichier) et toujours de 3 pour les camions (non indiqué dans le fichier)

Exercice 6 - Déléguons !

Le code de votre static factory a du devenir trop complexe, un switch ou une cascade de ifs. On voudrait fermer le code de la static factory et localiser la création de chaque vehicule dans un morceau de code spécifique.
Note: comme ce que l'on cherche c'est associer un code a exécuter en fonction de la chaine de caractère représentant le type de véhicule, on se dit qu'il doit y avoir une table de hachage cachée quelque part.
Implanter la solution retenue.

Exercice 7 - OCP

On veut pouvoir écrire un programme qui enregistrera une sous-factory permettant de créer un nouveau type de véhicule. Ce nouveau type de véhicule n'était pas connu quand vous avez livré votre package.
Comment faites-vous ?
Commencez par restructurez le code précédent pour que la factory principale ne "connaisse" plus les factory de Truck, Auto, Moto.
puis faites la modification pour introduire la sous-factory permettant de créer des fr.umlv.vehicle2.Bicycle.

Exercice 8 - Fermeture

En y regardant de plus près, la méthode createConvoy écrite est en fait un FileParser, dont la seule "intelligence" est de connaître le format général des fichiers de description et d'appeler la factory reçue en argument.
Ce code peut et doit être fermé. faites-le.
Doit-on toujours renvoyer une liste de véhicules ?
Exemple: comment un collègue pourra faire des statistiques sur le ratio camion/auto sur les convois de l'année ?