:: Enseignements :: Master :: M1 :: 2018-2019 :: Programmation Orientée Objet - Design Patterns ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Jouons à la guerre ! |
Ce TD se déroule en autonomie. Les rendus sont à faire sur la plate-forme elearning.
Les consignes précises du rendu :
- UN seul zip pour l'ensemble des sources + schémas UML en PlantUML + readme au format MarkDown + ...
- nommage du zip: NOM_PRENOM-tdxx.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
Ne faites
pas de copier/coller Wikipedia ! ce qui nous intéresse, c'est
votre compréhension et vos mots !
- Retour sur l'héritage: On veut modéliser des soldats.
Il existe cinq types de soldats : les soldats d'infanterie, de marine, les aviateurs,
les médecins militaires et les spécialistes "lanceurs de flamme".
Les soldats ont trois caractéristiques : la vitesse, la puissance de feu et les points de vie.
La vitesse et la puissance de feu dépendent uniquement du type de soldats; les points de vie sont spécifiques à chaque soldat,
mais les points de vie de départ sont spécifiques au type de soldat.
Expliquez pourquoi ce n'est pas une bonne idée de faire de l'héritage pour ce problème ?
- Donnez un exemple de pattern Composite que vous avez déjà rencontré ou codé. Etait-ce un composite transparent ou sûr ?
Exercice 2 - Des unités militaires
Le but de cet exercice est de modéliser des unités militaires, des soldats, des camions, etc.
Un soldat possède un type de base parmi 5 types prédéfinis (les soldats d'infanterie,
de marine, les aviateurs, les médecins militaires et les spécialistes "lanceurs de flamme").
Sa vitesse et sa puissance de feu et ses points de vies au démarrage sont celle de son type de base.
On arrive donc au code suivant :
-
Ecrire un ou plusieurs tests unitaires JUnit5 créant 4 soldats,
un Medic, un InfantryMan, un Aviator et un FlameThrower
et vérifiant que:
-
la somme de leur vitesse est 10.
-
la somme de leurs points de vie est 70.
-
la somme de leur puissance de feu est bien 80.
-
On souhaite introduire une classe représentant un camion (ArmyTruck) dans
lequel des soldats peuvent prendre place. La vitesse d'un camion est 10 et la puissance de feu
est 20. Le nombre de points de vie d'un camion est la somme des points de vie de l'ensemble des
soldats qui sont dans le camion.
Ecrire la classe ArmyTruck et écrire un test unitaire correspondant.
-
On souhaite pouvoir représenter une liste d'unités militaires qui sont soit des soldats
soit des camions. Comment faut-il faire ?
Faite les modifications au niveau du code et ecrivez un test unitaire qui crée une liste
d'unités militaires contenant un Medic, un InfantryMan et un camion
contenant lui-même un Aviator et un FlameThrower puis vérifiez
que les sommes des vitesses, puissance de feu et points de vie sont exactes.
-
Expliquer en quoi la classe ArmyTruck n'est pas une realisation
du design pattern composite.
Est-ce grave docteur ?
-
En fait, il existe bien un seul camion de l'armée mais chaque arme (air, terre et mer)
a subtilement transformé son camion ce qui fait que par exemple un marin qui appartient
à l'armée de mer à bien du mal à utiliser son fusil sur un camion configuré pour
l'armée de terre.
En terme de modélisation, la puissance de feu d'un camion correspond à la somme des puissances
de feu des soldats de la même arme que le camion. Les soldats des autres armées étant incapables
de tirer correctement.
Faites un diagramme UML (et prenez le en photo) du diagramme des classes qui prend un compte
cette modification.
Puis, effectuer les modifications correspondantes dans votre code.
Note: Les médecins n'appartiennent à aucune armée particulière.
-
Pour aller plus loin ...
Modifier votre code pour introduire un aircraft carrier et un destroyer
qui peuvent aussi contenir des soldats avec les deux restrictions suivantes:
-
Un aircraft carrier (resp le destroyer) appartient uniquement à l'armée de l'air (resp l'armée de mer).
-
Il est possible de mettre un camion sur un aircraft carrier ou un destroyer mais pas l'inverse :)
Cette condition doit être vérifiée à la compilation, et non pas à l'exécution !
Attention, il ne *doit* pas y avoir de duplication de code un aircraft carrier et un destroyer. Comment pourriez-vous aussi éviter la duplication avec les Camions ? Est-ce que cela a des impacts fonctionnels ?
© Université de Marne-la-Vallée