:: Enseignements :: Master :: M1 :: 2019-2020 :: Programmation Orientée Objet - Design Patterns ::
[LOGO]

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 : 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 !

  1. 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.
    #EXPLICATIONS Expliquez pourquoi ce n'est pas une bonne idée de faire de l'héritage pour ce problème ?
  2. #EXPLICATIONS 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 :

  1. #CODE 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.
  2. 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.
    #CODE Ecrire la classe ArmyTruck et écrire un test unitaire correspondant.
  3. On souhaite pouvoir représenter une liste d'unités militaires qui sont soit des soldats soit des camions.
    #EXPLICATIONS Comment faut-il faire ?
    #CODE 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.
  4. #EXPLICATIONS Expliquer en quoi la classe ArmyTruck n'est pas une realisation du design pattern composite.
    #EXPLICATIONS Est-ce grave docteur ?
    #UML Faites le schéma UML et comparez le au schéma du DP Composite
  5. 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.
    #UML Faites un diagramme UML (et prenez le en photo) du diagramme des classes qui prend un compte cette modification.
    #CODE Puis, effectuer les modifications correspondantes dans votre code.
    Note: Les médecins n'appartiennent à aucune armée particulière.
  6. Pour aller plus loin ...
    #CODE 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 !
    #EXPLICATIONS 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 ?
    #UML Faites le diagramme UML de votre solution