Skip to topic | Skip to bottom
Home
Minfo
Minfo.GlTD4r1.6 - 04 Nov 2012 - 14:39 - PhilippeCollettopic end

Start of topic | Skip to actions

TD 4 : Généricité

PhilippeCollet

Objectifs

Ce TD est en deux parties. La première va consister à expérimenter deux implémentations de la généricité, complètement dynamique, puis en couplant la généricité statique de Java 5 avec des contrôles de type dynamiques.

Expérimentations sur la généricité

  • Une liste monomorphe est une liste dont tous les éléments sont exactement du même type, sans aucun surtype ou soustype. Elle est dynamique (resp. statique) si l'on fixe le type de ses éléments pendant l'exécution (resp. la compilation). Dans cette question, on va manipuler des listes monomorphes dynamiques, puis statiques.
  • Créez un nouveau projet TIP (un peu d'aide au cas ou vous êtez toujours un peu perdu avec cette phase) :
    • soit pour importer ensuite les sources :
      • Créez votre projet dans le workspace d'Eclipse, soit dans un répertoire de TD spécifique, et terminez.
      • Téléchargez l'archive genericite.zip dans le répertoire créé pour ce projet et importez, sous Eclipse, le sous-répertoire "util". ALERT! Pour importer le contenu d'une archive, cliquez-droit sur le projet : cela fait apparaître une fenêtre d'importation, puis dans le menu [Général/fichier d'archive/suivant], vous parcourez votre hiérarchie de fichiers pour localiser l'archive et vous poursuivez l'exploration à l'intérieur de l'archive jusqu'au sous-répertoire "util".
    • soit en recopiant le contenu de l'archive dans un projet organisé avec un répertoire src :
      • Créez votre projet et n'oubliez pas de cocher l'option pour le créer avec un répertoire src spécifique pour les sources.
      • Téléchargez l'archive genericite.zip et décompactez la dans le répertoire src de votre projet.
      • Rafraichissez les fichiers du projet pour voir apparaître les nouveaux packages et classes.
  • Vous êtes face à deux implémentations de liste qui hérite de ArrayList pour contraindre de différentes manières la généricité.
  • Dans un sous-package test, il y a aussi une classe de test (à compléter par la suite) pour chacune de ses classes.

Liste monomorphe dynamique

Dans cette première version (MonoDynList), la classe hérite tout simplement de ArrayList<Object>. On veut donc une liste qui assure que tous ses éléments sont exactement du même type. La contrainte est placée à la création, soit par le passage d'un objet Class, soit par le passage d'un objet prototype, premier élément de la liste. Il vous faut donc :

  • compléter les constructeurs,
  • compléter la méthode add (ALERT! lisez bien les commentaires).

Une fois ceci réalisé, posez-vous la question de comment tester que la méthode add fait bien son travail (TIP c'est le genre de questions qu'on peut poser à un examen...). Puis, vous pourrez vérifier en observant la solution proposée dans la classe de test correspondante. Il restera encore à compléter les différents tests en suivant les instructions et à exécuter la classe de test JUnit.

Liste monomorphe statique/dynamique

Dans cette deuxième version (MonoMultiList), la classe est générique au sens de Java 5, et elle hérite de ArrayList<T>. Les choses sont un peu plus compliquées car on veut pouvoir faire fonctionner la classe en mode monomorphe (booléen isMono à vrai) ou en mode polymorphe classique.

De la même manière que précédemment, il vous faut :

  • compléter la classe,
  • réfléchir à comment la tester,
  • vérifier votre intuition, compléter la classe de test et passer les tests.

Observez bien les commentaires d'explication déjà placés dans les classes et observez aussi quand sont effectués les vérifications (à la compilation ou à l'exécution).

Généricité contrainte dans le simulateur

  • Créez comme précédemment un nouveau projet pour la suite de ce TD.
  • Téléchargez l'archive gensimu.zip dans le répertoire de ce projet et importez le sous-répertoire "bebetes" de l'archive.

Vous êtes encore face à une version du simulateur, qui correspond grossièrement à la version utilisée dans le TD sur les tests.

Il s'agit ici d'utiliser la généricité de Java 5 dans le simulateur.

Conception

Dans le cadre de ce TD, on réduit la réflexion sur la généricité à la conception de la structure collective qui contient les bébêtes simulées. Pour l'instant, c'est une ArrayList à l'ancienne mode. Plusieurs questions se posent :

  • Aurait-on intérêt à gérer une ou des listes monomorphes de bébêtes dans le simulateur ?
  • La contrainte de liste monomorphe serait-elle trop contraignante ?
Décidez ainsi de quels compromis doivent être faits dans la conception du simulateur et quelle forme de généricité doit-on appliquer.

Utilisation des mécanismes génériques Java 5

Il faut maintenant modifier le code en conséquence. Les modifications à faire sont sur la classe ChampDeBebetes :

  • Il faut déclarer la liste des bébêtes et les fonctions associées de façon à ce que le champ puisse manipuler diverses bébêtes.
  • Il faut aussi modifier la fabrication des bébêtes pour la rendre la plus générique, tout en effectuant la création des BebeteHasard.

ALERT! Si vous pensez que votre version marche bien, parce que cela compile, essayez donc maintenant d'inclure la classe de test de BebeteHasard qui utilise le champ (archive gensimu-test.zip), tout à fait correcte, dans votre projet. Si cela ne fonctionne pas, c'est que vous avez oublié un principe important dans l'affectation des listes (méthode setBebetes). Il faut alors modifier votre code en conséquence...

-- PhilippeCollet - 02 Nov 2012
to top

I Attachment sort Action Size Date down Who Comment
genericite.zip manage 2.4 K 02 Nov 2012 - 21:37 PhilippeCollet  
gensimu-test.zip manage 1.4 K 02 Nov 2012 - 23:18 PhilippeCollet  
gensimu.zip manage 6.7 K 04 Nov 2012 - 14:39 PhilippeCollet  

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

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