:: Enseignements :: ESIPE :: E4INFO :: 2017-2018 :: Programmation Orientée Objet - Design Patterns ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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 :
- UN seul zip pour l'nsemble des sources + photo UML + readme au
format MarkDown + ...
- nommage du zip: NOM_PRENOM--NOM-PRENOM-td3.zip
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 !
-
#EXPLICATIONS Donnez votre définition d'une "static factory" et votre
définition d'une "factory method".
-
#EXPLICATIONS Qu'ont en commun les méthodes du JDK suivantes :
-
#EXPLICATIONS 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.
-
#CODE 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.
-
#CODE 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.
-
Dans les fichiers de description, on pourra donc avoir des lignes
pour des motos ou des autos. La manière de les décrire reste
identique.
Exemple moto green 150 ou auto red 1200
#UML Faites le schéma UML de la solution que vous allez mettre en place.
#CODE Adapter la méthode de construction d'un convoi et créer les classes
ou interfaces éventuellement nécessaires.
-
Concernant le calcul de la taxe :
- pas de taxe pour les motos
- taxe fixe de 15.5 pour les voitures
#EXPLICATIONS Que devez-vous changer dans le calcul de la taxe d'un convoi ?
Exercice 4 - Factory ?
-
#UML et #CODE Si ce n'est pas déjà fait, séparer la création des objets du parsing
du fichier, autrement dit, créer les véhicules à l'aide
d'une factory.
(rappelez-vous du 'S' de SOLID !)
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)
-
#CODE Adaptez vos classes et leur constructeur pour prendre en compte ce nouveau
paramètre de nombre de personnes transportées.
-
Pour gérer cette évolution du fichier de description (qui ne sera
pas la dernière!), on ne veut pas compliquer le parsing du fichier,
#CODE modifiez donc votre factory pour qu'elle propose une méthode
Vehicle create(String type, List<String> description)
-
#EXPLICATIONS Qu'est-ce qui n'avait pas été "bien" fait ?
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.
#UML Adaptez le schéma UML à cette évolution.
#CODE 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.
#EXPLICATIONS Comment faites-vous ?
#CODE Commencez par restructurez le code précédent pour que la factory
principale ne "connaisse" plus les factory de Truck, Auto, Moto.
#CODE puis faites la modification pour introduire la sous-factory
permettant de créer des fr.umlv.vehicle2.Bicycle.
#EXPLICATIONS et #UML Expliquez et illustrez en quoi votre schéma UML a été modifié.
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.
#EXPLICATIONS Doit-on toujours renvoyer une liste de véhicules ?
#EXPLICATIONS Exemple: comment un collègue pourra faire des statistiques sur le
ratio camion/auto sur les convois de l'année ?
#CODE Ce code peut et doit être fermé. faites-le.
#UML Faites le schéma UML de la solution complète.
© Université de Marne-la-Vallée