Skip to topic | Skip to bottom
Home
Minfo
Minfo.GlTD1y1314r1.1 - 08 Oct 2013 - 21:23 - 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-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-3.7.2/eclipse -vmargs -Xmx512M &

Prise en main (à faire avant le TD 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 : une méthode toString générique

Ecrivez, dans la classe BebeteAbstraite 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 bébête du simulateur sur la sortie standard (prenez par exemple la première bébête dans le moteur de simulation du ChampDeBebetes).

Exercice 3 : 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) !

Simulateur de créatures

Création d'une nouvelle classe

Créez une nouvelle classe BebeteEmergente qui simule le comportement suivant :

  • Essaye d'aller à la vitesse moyenne des bébêtes autour
  • Va dans la direction moyenne du troupeau environnant (les bébêtes autour)
  • Maintient une distance minimale avec celles qui sont autour

Vous pouvez construire le comportement de votre bébête au fur et à mesure en définissant la méthode agit(). Regardez bien les méthodes utilitaires fournies dans les classes BebeteAbstraite et ChampDeBebetes : la direction d'une bébête est gérée en radians (soit une valeur entre 0 et 2*PI) et vous avez pratiquement toutes les informations précalculées. N'oubliez pas de faire des modifications pour que le champ de bébêtes utilise vos bébêtes à la place des bébêtes stupides.

Aide :

  • pour qu'une bestiole avance dans une certaine direction, si x,y est sa position initiale et dir sa direction en radians, le nouveau x vaudra x + distance de déplacement en pixels * cos(dir), y vaudra y + distance de déplacement * sin(dir).
  • Par défaut, la liste des bébêtes qui sont dans le champs de vision correspond à toutes les bébêtes en face de la bébête courante. Pour obtenir de meilleurs résultats, modifiez la méthode qui calcule la liste des bébêtes pour ne renvoyer que celles qui sont en face et par exemple à moins de 20 pixels de distance. BebeteAbstraite propose des fonctions de calcul de distance.

Tranformation du modèle objet 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 bébêtes lors de l'exécution ?
  • ...

Remarque : il n'est pas demandé de corriger tous ces problèmes pour l'instant, certaines erreurs évidentes peuvent être corrigées, Eclipse les a déjà détectées pour vous !

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 - 08 Oct 2013
to top

I Attachment sort 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  
increment.png manage 8.5 K 08 Oct 2013 - 21:32 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  

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