TD 1 : Réfléxivité en Java, prise en main du projet récurrent
PhilippeCollet (avec des éléments de Michel Buffa et Filip Krikava)
Introduction

Cette page va être mise à jour avec les différentes informations pour l'installation des outils sur vos portables
Dans le cadre des TDs, les versions de référence sont soient :
- Eclipse 4.4 et JDK 1.7
- Eclipse 4.3 et JDK 1.6.
L'ensemble des codes sont compatibles avec le JDK 1.6 et n'utilisent pas de spécificités Java 7 ou Java 8.
Si vous utilisez Eclipse sur votre machine personnelle, sachez qu'il risque d'y avoir de petites différences de présentation entre les versions successives de 3.2 à 3.7 et la dernière version 4.4. S'il faut toujours une version des plugins compatibles avec votre version de base d'Eclipse, les tutoriaux et autres copies d'écran ne varient que très peu pour les éléments utilisés dans ce cours.
Lancement et paramétrage
Eclipse 3.7.2 Version installée sous Linux (postes fixes du département d'informatique)

il est possible qu'une version plus récente soit présente sur les machines
Normalement, la version 3.7.2 d'Eclipse doit être installée sur toutes les machines. Vous devriez aussi disposer d'un JDK récent (jdk1.6.0_21). Il ne faut pas qu'Eclipse soit démarrer avec le JDK gnu (gcj /
OpenJDK??) dans votre PATH car celui-ci ne couvre pas toutes les bibliothèques nécessaires. Il faut donc que dans votre environnement (édition de profile, .bashrc, etc.), vous ayez l'équivalent de ce qui suit:
export PATH=/usr/local/java/jdk1.6.0_21/bin:$PATH
Eclipse 3.7 peut être démarré de la façon suivante :
/usr/local/eclipse/eclipse-3.7.2/eclipse &

En cas de plantage de l'environnement sur "OutOfMemory", il vous faudra créer un alias ou une commande pour exécuter ceci :
/usr/local/eclipse/eclipse-3.7.2/eclipse -vmargs -Xmx512M &
Prise en main (à faire si vous n'avez pas utilisé Eclipse auparavant)
La page d'aide de bienvenue devrait s'afficher à la fin du lancement :
- Effectuez le tutorial HelloWorld intégré a Eclipse (création de projet, compilation, exécution). Observez et explorez !
- Dans le tutorial Eclipse de JM Doudoux, effectuez :
- les chapitres 3 à 6 de la première partie,
- surtout le chapitre 7 de la deuxième partie (les chapitres 8 et 9 pourront être vus par la suite, ils sont très utiles),

Au moment de l'écriture de ce sujet de TD, le tutoriel correspond à la version 3.2 d'Eclipse. Comme nous utilisons la version 3.7 ou la version 4.4, il y a de petites différences...
Après ça, vous devriez être paré pour démarrer et continuer à acquérir de l'expérience dans Eclipse.
Prenez votre temps pour expérimenter. Comme tous les gros IDE, Eclipse peut être rebutant au départ, mais il peut aussi rendre de grands services si on sait comment utiliser les bonnes fonctionnalités au bon moment.
Exercice 1 : un analyseur de classes
Ecrivez une programme qui attend qu'on tape au clavier le nom d'une classe puis qui affiche à l'écran, si possible avec une indentation significative, toutes les informations relatives à cette classe.
On ne demande que les membres définis dans la classe, pas ceux qui sont hérités.
Voici
un exemple d'utilisation avec la classe Date.
Voici un squelette de la classe
AnalyseurDeClasse.java. Vous devez compléter le code. N'oubliez de travailler de manière incrémentale (d'abord au moins le nom de la classe, puis les classes ancêtres, etc).
Pour commencer, ne vous occupez pas de la généricité : partout ou vous manipulerez un objet de type "Class", vous l'afficherez simplement par son nom en utilisant la méthode getName. Si vous passez beaucoup de temps sur ce premier exercice, il vaut mieux ne pas vous occuper du tout de la généricité et d'abord passer aux deux exercices suivants.
Exercice 2 : un tableau grossissant
Travail à effectuer
- Récupèrez le fichier ArrayGrowTest.java, tiré du livre Core Java ("au coeur de Java" dans la version française).
- Complétez la méthode goodArrayGrow(...) pour qu'elle fonctionne.
Dans un premier temps laissez les deux lignes :
//a = (int[])goodArrayGrow(a);
//arrayPrint(a);
...en commentaires.
Ce que vous devez obtenir c'est :
javaw ArrayGrowTest
Personne[12]
Maurice Chombier
François Pignon
null
null
null
null
null
null
null
null
null
null
The following call will generate an exception.
java.lang.ClassCastException: [Ljava.lang.Object;
at ArrayGrowTest.main(ArrayGrowTest.java:40)
Exception in thread "main"
Process ArrayGrowTest exited abnormally with code 1
Tous les "null" qui s'affichent sont normaux, ils prouvent que votre tableau a grossi.
Décommentez maintenant les deux lignes correspondant au tableau de int. Ca devrait ne plus marcher... Essayez de faire quand même marcher le programme (aide: utilisez la classe Array) !
Introduction du simulateur de créatures
Créez un nouveau projet à partir du contenu de
creatures.zip :
- soit vous placez le contenu dans un répertoire hors de votre workspace et vous créerez le projet "à partir d'une source existante",
- soit vous créerez un projet vide, puis vous recopierez le contenu de l'archive et vous réactualiserez le projet.
L'archive contient 4 fichiers java :
- L'application fournit une architecture pour faire des simulations de Creature : une créature a une position, elle se déplace dans une certaine direction avec une vitesse donnée et elle peut voir devant elle avec un certain champ de vision. Elle est censée agir (se déplacer dans un premier) temps en fonction de son environnement (les créatures autour par exemple).
- Le package contient quatre classes
- La classe principale est Launcher : ce n'est qu'une frame graphique qui contient un Environment.
- La classe Environment s'occupe de créer les créatures et agit comme le moteur de la simulation. Régulièrement (avec un thread), elle fait "agir" chaque créature. Cette classe s'occupe aussi de dessiner les créatures.
- La classe AbstractCreature est une classe abstraite qui regroupe les attributs de toute créature (position, vitesse, direction...) ainsi que de quoi la dessiner (couleur, methode graphique). La seule méthode abstraite est "act" dans laquelle doit être définie le comportement.
- La classe StupidCreature ne fait que définir "agit" en utilisant vitesse et direction.
Explorez le code et exécutez cette application.
Exercice 3 : une méthode toString générique
Ecrivez, dans la classe AbstractCreature du précédent projet, une méthode :
public String toString() {...}
...qui affiche le nom des attributs
et leur valeur, mais sans en connaître le nombre ni le type à l'avance.
N'essayez pas de voir les attributs hérités dans un premier temps. En effet, la méthode getDeclaredFields() de la classe Class ne retourne que les attributs locaux.
Pour tester la méthode, faites par exemple afficher régulièrement les caractéristiques d'une créature du simulateur sur la sortie standard (prenez par exemple la première créature dans le moteur de simulation du Environment).
Exercice 4 : Création d'une nouvelle classe dans le simulateur
Créez une nouvelle classe SmartCreature qui simule le comportement suivant :
- Essaye d'aller à la vitesse moyenne des créatures autour
- Va dans la direction moyenne du troupeau environnant (les créatures autour)
- Maintient une distance minimale avec celles qui sont autour
Vous pouvez construire le comportement de votre créature au fur et à mesure en définissant la méthode act(). Regardez bien les méthodes utilitaires fournies dans les classes AbstractCreature et Environment : les annexes en bas de page peuvent bien vous aider.
Exercice 5 (à finir hors TP) : Revue de code du simulateur
Essayez de donner la liste de tous les problèmes de conception présents dans le projet :
- Certains attributs static sont-ils vraiment des attributs de classe ou d'instance ?
- Que faire des fonctions utilitaires sur les calculs de distance et de direction ?
- Que faire pour que la simulation même soit indépendante de la partie graphique ?
- Que faire pour changer le comportement des créatures lors de l'exécution ?
- ...
Annexes
Trigo et axes
Méthode directionFromAPoint()
dans AbstractCreature
Méthode creaturesAround()
dans Environment
Methode act()
dans SmartCreature
--
PhilippeCollet - 29 Oct 2014
to top