:: Enseignements :: Master :: M1 :: 2015-2016 :: 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 !
- Donnez votre définition d'une "static factory" et votre définition d'une "factory method".
- Qu'ont en commun les méthodes du JDK suivantes :
- 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.
-
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.
-
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
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
Que devez-vous changer dans le calcul de la taxe d'un convoi.
Exercice 4 - Factory ?
-
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.
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)
-
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,
modifiez donc votre factory pour qu'elle propose une méthode Vehicle create(String type, List<String> description)
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 representant
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 (optionnel)
En y regardant de plus près, la méthode createConvoy écrite en scéance 2 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.
Fermer ce code de parsing comme vous aviez fermé le code du serveur au td1-C.
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 ?
© Université de Marne-la-Vallée