Skip to topic | Skip to bottom
Home
Minfo
Minfo.GlTD5r1.4 - 11 Nov 2012 - 20:51 - PhilippeCollettopic end

Start of topic | Skip to actions

TD 5 : Héritage

PhilippeCollet

Introduction

Objectifs

Dans ce TD, il s'agit de restructurer notre... simulateur de bébêtes afin :

  • d'abstraire assez proprement les entités qui pourraient se trouver dans le simulateur,
  • d'abstraire les différents mécanismes qui sont dans le champ de bébêtes dans sa version actuelle.
Ceci va vous amener à expérimenter de manière conjointe les mécanismes d'interface, de classe abstraite, d'héritage multiple (d'interface, en Java), de mariage de convenance (l'utilisation combinée d'un héritage simple et d'une délégation, en Java). C'est bien dans l'utilisation combinée de ces mécanismes que se trouve la difficulté car il vous faudra :
  • déterminer les bonnes interfaces et classes, ainsi que leurs relations
  • trouver quoi mettre dedans
  • pour finalement retomber sur quelque chose d'équivalent à la version de départ, en bien mieux conçu !

Point de départ

  • Créez un projet pour démarre ce TD et placez dedans le contenu de l'archive heritage.zip. N'oubliez pas de bien créer votre projet selon les consignes explicitées dans le TD 5.
  • Et voila encore une nouvelle version du simulateur, qui tient compte de la généricité en Java 5, pour donner ainsi des éléments de correction au TD sur la généricité.

Démarche

Effectuez ce travail d'abstraction est très intéressant, mais beaucoup trop long à réaliser entièrement en un TD. Vous allez donc :

  • essayez de répondre à certaines questions "sur papier",
  • puis, vérifiez par vous même que cela est proche, ou pas, de la solution proposée (une parmi tant d'autres). Il y a des diagrammes de classes partiels pour vous aider de questions en questions, puis une nouvelle archive avec du code pour que vous puissiez implémenter les parties les plus intéressantes à la fin.

ALERT! Il s'agit ici de jouer le jeu pour effectuer à la fois un travail de conception et d'implémentation, pas de terminer le TD en 15 minutes chrono...

Abstraction des entités simulées

Essayons de mettre à plat ensemble les entités simulées à partir du code que nous avons au départ. On peut déjà distinguer un certain nombre de rôles différents dans une bébête (qu'on va arrête d'appeler BebeteAbstraite, mais Bebete) :

  • c'est une entité graphique qui se dessine avec une certaine couleur;
  • c'est une entité qui a une certaine position dans un champ;
  • c'est une entité qui se déplace et se dirige (vitesse et direction), on distinguera position et déplacement, car on pourrait vouloir mettre des entités positionnées mais inertes dans notre simulateur;
  • c'est une entité qui agit, ou tout du moins qui s'actionne, puisque c'est le "moteur de simulation" qui l'a fait agir...

Concevez le diagramme de classes et d'interfaces qui correspond à ces exigences, sachant qu'il faut privilégier les interfaces au plus haut niveau d'abstraction, puis essayer d'utiliser des classes abstraites lorsque certains services sont à fournir et enfin trouver des classes concrètes comme les BebeteEmergente et BebeteHasard.

NB: ne perdez pas de temps avec les méthodes utilitaires de calcul de direction et de distance, on les placera dans une classe... utilitaire ! Ne perdez pas non plus de temps avec l'affichage générique toString fait par réfléxivité, on ne s'en occupe pas.

Correction (ne regardez pas tout de suite) : entites.jpg en bas de la page

Une fois la correction observée, n'hésitez pas à (vous) poser des questions sur la justification des choix de conception.

Abstraction du champ et du moteur de simulation

Effectuons maintenant le même travail pour le champ de bébêtes :

  • c'est au moins un champ d'une certaine dimension qui contient des entités positionnables, comme décidé dans la question précédente;
  • il y a un moteur de simulation avec un thread qui fait "agit()" régulièrement sur des choses "actionnables";
  • il y a aussi un moteur d'affichage, plutôt mal fichu, car entièrement couplé avec le moteur de simulation à coup de méthode repaint, alors qu'il serait beaucoup mieux d'avoir un second moteur (donc un second thread) pour la visualisation, indépendamment de la simulation.

Correction (ne regardez pas tout de suite) : champ.jpg en bas de la page

Ici aussi, une fois la correction observée, n'hésitez pas à (vous) poser des questions sur la justification des choix de conception.

Mise en oeuvre de l'ensemble

  • Dans un nouveau projet, déballez le contenu de l'archive heritage-abstraction.zip.
  • Vous disposez d'une version intermédiaire de ce qui vient d'être conçu :
    • Les interfaces sont fournies,
    • Des classes sont déjà implémentées :
      • Vous remarquerez l'implémentation correcte du contrôle des threads dans les classes concernées
      • Vous remarquerez aussi la nécessité de filtrer ce qui est vu par une BebeteEmergente pour qu'elle puisse extraire des entités "dirigeables" à partir de la liste des choses vues, plus abstraites.
    • Les utilitaires sont dans un package séparé.
  • Il vous reste à implémenter quelques classes :
    • Bebete (classe abstraite), qui ne devrait pas poser beaucoup de problèmes, il faut réfléchir à quoi implémenter en fonction de ce qui est fourni dans les sous-classes et de la nouvelle hiérarchie.
    • ChampDeBebetes, en implémentant un mariage de convenance : une classe est héritée, l'autre est placée en attribut et certains messages vont être délégués...

L'ensemble doit fonctionner et devrait être bien extensible par la suite !

-- PhilippeCollet - 11 Nov 2012
to top

I Attachment sort Action Size Date Who Comment
heritage.zip manage 6.9 K 30 Nov 2009 - 14:39 PhilippeCollet  
heritage-abstraction.zip manage 9.3 K 30 Nov 2009 - 14:39 PhilippeCollet  
champ.jpg manage 283.4 K 06 Nov 2008 - 16:10 PhilippeCollet  
entites.jpg manage 271.4 K 06 Nov 2008 - 16:10 PhilippeCollet  

Minfo.GlTD5 moved from Minfo.GlTD6 on 26 Oct 2009 - 15:39 by PhilippeCollet - put it back
You are here: Minfo > GenieLog > GlTD5

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback