Skip to topic | Skip to bottom
Home
Minfo
Minfo.GlTD1y1314r1.3 - 09 Oct 2013 - 12:34 - PhilippeCollettopic end

Start of topic | Skip to actions

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

ALERT! Cette page va être mise à jour avec les différentes informations pour l'installation des outils sur vos portables

Dans le cadre de ce TD (et des suivants si tout va bien), vous allez utiliser un IDE (Integrated Development Environment) sous Linux, en l'occurence, Eclipse 3. Eclipse (www.eclipse.org) est un des environnements de développement intégré les plus utilisés actuellement.

Vous allez utiliser Eclipse avec un JDK 1.6.

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.3. 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

Installation sur portable : JDK6 / Eclipse4.3

TIP Partie spécifique à une installation sur portable

A installer :

  1. Java SE Development Kit 6
  2. Eclipse 4.3 : http://www.eclipse.org/downloads/ :

Eclipse 3.7.2 Version installée sous Linux (postes fixes du département d'informatique)

TIP 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 &

ALERT! 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),

ALERT! 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.3, 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).

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

Coordonnées et angles

graphicalSystem.png

Méthode directionFromAPoint() dans AbstractCreature

directionFromAPoint.png

Méthode creaturesAround() dans Environment

creaturesAround.png

Methode act() dans SmartCreature

increment.png

-- PhilippeCollet - 09 Oct 2013


to top

I Attachment sortdown Action Size Date Who Comment
AnalyseurDeClasse.java manage 2.5 K 08 Oct 2013 - 21:29 PhilippeCollet  
ArrayGrowTest.java manage 2.3 K 08 Oct 2013 - 21:29 PhilippeCollet  
creatures.zip manage 7.0 K 09 Oct 2013 - 11:30 PhilippeCollet  
creaturesAround.png manage 16.1 K 08 Oct 2013 - 21:33 PhilippeCollet  
directionFromAPoint.png manage 23.8 K 08 Oct 2013 - 21:33 PhilippeCollet  
graphicalSystem.png manage 8.9 K 08 Oct 2013 - 21:33 PhilippeCollet  
increment.png manage 8.5 K 08 Oct 2013 - 21:32 PhilippeCollet  

You are here: Minfo > GlTD1y1314

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