IN101 – TP2 09/10 v2
Sujet

Durée : 2 h

1         OBJECTIFS

·         Comprendre le concept de référence (flèche) et le principe de l'interaction entre objets

2         LECTURE / COMPILATION (< 15mn)

Sauvegarder (dans In101/Tp2) puis Projet/Ouvrir non-BlueJ… le fichier compilation.jar . Lire la classe, regarder comment sont programmées/présentées les différentes méthodes. Lire les commentaires javadoc et les retrouver dans la vision « Interface » ; dans quel ordre les accesseurs apparaissent-ils ?
Puis compiler / traduire-comprendre le message d’erreur / corriger, et recommencer jusqu’au succès.

3         CRÉATION DE MÉTHODES

Nota : le travail demandé doit être terminé, en séance ou, à défaut, hors séance.

3.1      Projet "picture"

Cet exercice va consister à modifier des classes d'un exemple de projet BlueJ : le projet picture

3.1.1      Préparer l'environnement de travail

Sauvegarder (dans In101/Tp2) puis ouvrir le fichier proj_picture.jar .

3.1.2      Découvrir et essayer le projet picture

1.      Dans la fenêtre principale de Bluej,  les flèches entre classes définissent des liens de dépendance. Les flèches en tireté spécifient un lien "uses". Comme l'indiquent ces flèches, la classe Picture utilise les classes Circle, Square et Triangle, et ces dernières utilisent la classe Canvas.     
La classe Canvas définit des utilitaires de bas niveau pour l'affichage graphique d'objets : nous ne l'étudierons pas de suite.

2.      Après avoir compilé (si nécessaire), créer une instance de la classe Picture [ clic droit sur cette classe puis choisir new Picture( ) ].     
Invoquer la méthode draw de cette instance [ clic droit sur l'objet puis choisir void draw( ) ].   
L'image affichée illustre que l'objet de type Picture est une composition d'objets de type Circle, Square et Triangle. Invoquer maintenant la méthode place.     Que devrait-elle provoquer ?
Que se passe-t-il ? Les méthodes appelées effectuent-elles les déplacements souhaités ?

3.1.3      Compléter les méthodes de déplacement lent (par récursivité)

1.      Lire la classe Square et chercher la méthode slowMoveVertical. Un commentaire indique où la compléter. Écrire les instructions permettant un appel récursif de cette méthode avec un appel de MoveVertical d’un seul pixel à chaque fois dans la bonne direction (vDelta). Compiler. Tester.

2.      Reporter cette modification dans slowMoveHorizontal en adaptant les noms. Compiler. Tester.

3.      Reporter ces modifications dans les classes Circle et Triangle. Compiler. Tester. Maison ensoleillée?

3.1.4      Modifier la classe Circle

1.      Prendre connaissance du code source de la classe Circle [ double-clic ].

2.      Exercice 3.1.4a : Créer dans la classe Circle la fonction suivante :

o        nom : getPosition

o        paramètre : aucun

o        valeur de retour : la position de l'objet codée sous la forme 1000*x + y, où x et y sont les coordonnées du cercle (on supposera avoir toujours des coordonnées positives < 1000).

3.      Compiler, créer un objet de type Circle, puis tester le bon fonctionnement de la méthode getPosition (la méthode doit apparaître grâce à un clic-droit sur l’objet). Comment savez-vous que c’est le bon résultat ?

4.      Exercice 3.1.4b : Créer dans la classe Circle un deuxième constructeur :

o        signature : celle d’un constructeur (avec les paramètres ci-dessous) !

o        comportement : initialise les 4 attributs de l’objet avec les 4 paramètres correspondant, et aIsVisible systématiquement à true.

5.      Compiler, puis créer un objet de type Circle à l’aide de ce nouveau constructeur. Pourquoi le cercle n’est-il pas visible ? Voir l’exercice suivant pour résoudre ce problème.

Rappel : On notera que la classe Circle possède ainsi deux méthodes de même nom : Circle. Ceci ne crée pas d'ambiguïté car ces deux méthodes ont des signatures différentes. Cette possibilité qu'offre Java est appelée surcharge.

6.      Exercice 3.1.4c : Modifier ce nouveau constructeur pour que le cercle soit automatiquement visible dès sa création. Regarder la méthode makeVisible() pour comprendre pourquoi le cercle n’était pas visible, puis appeler cette méthode plutôt que positionner aIsVisible à true.

7.      Compiler, créer un objet Circle, puis tester le bon fonctionnement de cette nouvelle version.

3.1.5      Modifier la classe Picture

1.      Prendre connaissance du code source de la classe Picture.

2.      Exercice 3.1.5a : Modifier la classe Picture de façon à ajouter un deuxième soleil dont seule la couleur a été modifiée. Compiler et tester. Pourquoi le premier soleil n’est-il plus visible ? setBlackAndWhite() et setColor() fonctionnent-elles toujours ?  Sinon, corriger et tester.

3.      Exercice 3.1.5b : Modifier la classe Picture de façon à ce que la méthode qui rend l’image visible soit appelée automatiquement à la création de l’objet. Compiler et tester.

4.      Exercice 3.1.5c : Créer dans la classe Picture la méthode suivante    
      sans modifier la classe Circle ,  puis compiler et tester.

5.      Exercice 3.1.5d : Modifier la classe Picture de façon à ne pas avoir à répéter 2 fois à peu près la même chose dans getTwoSunPositions(). Pour cela, créer une nouvelle fonction getSunPosition() (publique ou privée ?), retournant une String et acceptant un cercle en paramètre, et ne retournant la position que de ce cercle. Ensuite, getTwoSunPositions() n’a qu’à appeler getSunPosition() 2 fois. Compiler et tester.

6.      Exercice 3.1.5e : Modifier la méthode getSunPosition() pour qu’elle accepte en plus un paramètre String contenant le nom (que vous avez choisi) du cercle dont elle retourne la position ; la String retournée commencera donc par "nom : ". Modifier la méthode getTwoSunPositions() en conséquence. Compiler et tester.

3.1.6      Générer automatiquement la documentation

1.      Exercice 3.1.6a : Ajouter, en anglais de préférence, des commentaires de documentation aux méthodes que vous avez développées pour qu'elles soient renseignées au moins au même niveau que les autres. Regarder l’ « interface », puis prendre connaissance de l'arborescence des fichiers générés et, sous navigateur, consulter le fichier index.html.

2.      Exercice 3.1.6b :  Mêmes étapes pour la classe Picture (une des méthodes n’est pas commentée).

3.      Prendre connaissance de l'arborescence des fichiers générés et, sous navigateur, consulter le fichier index.html. Quel est le problème ?

4.      Pour y remédier, [menu Outils, choix Générer la documentation du projet]. Attendre suffisamment longtemps, puis vérifier le résultat en navigant parmi toutes les classes du projet.

3.1.7      Améliorer la documentation

1.      Se reporter au « styleguide » de javadoc :

http://java.sun.com/j2se/javadoc/writingdoccomments/index.html#styleguide .

2.      Lire les parties consacrées aux « tags » @author, @version, @param, @return, et @see . Lire le reste en travail personnel.

3.      Exercice 3.1.7a : Ajouter/compléter (si nécessaire) les commentaires javadoc en incorporant des @author et un @version dans chaque classe, ainsi que le @return et les @param dans chaque méthode. Regénérer la documentation et vérifier les informations qui y figurent désormais.

3.1.8      Terminer l'exercice

Regénérer la javadoc puis sauvegarder le projet picture [menu Projet, choix Enregistrer] et envoyer les fichiers à votre voisin. Un peu fastidieux, non ?  Alors essayer plutôt [menu Projet, choix Exporter (jar)…] puis envoyer uniquement le fichier .jar ainsi créé. Le destinataire n’aura plus qu’à utiliser [menu Projet, choix Ouvrir non-BlueJ…] et à désigner le fichier .jar.

Fermer le projet picture [menu Projet, choix Fermer] , voire BlueJ.

 

4         Fin du TP

·    Avez-vous bien fait TOUS les exercices, dans TOUTES leurs étapes ?

·    Avez-vous compris TOUT ce que vous avez vu ? Sinon, demandez à un intervenant.

·    Avez-vous expérimenté le Code-Pad ?  (Essayez :  int i=12;8  i*28  etc…)

·    N’avez-vous pas d’idées d’autres modifications de méthodes que celles proposées ? Expérimentez-les.

·    Lisez les compléments de cours présents sur la page web de l’unité (notamment 2.1 et 2.2).

·    Si vous avez fini avant les 2 heures prévues, demandez aux intervenants si vous pouvez partir avant la fin du TP ou bien s’ils vous donnent un autre exercice à faire.

·    Sinon, terminez tout en travail personnel avant le prochain tp.

Ce sujet a été élaboré par Denis Bureau, d’après un sujet d’Albin Morelle.