TP_SLAM2_11_ClassesObjets

advertisement
Contexte : nous allons reprendre et approfondir les notions de classe d'objet et de POO (programmation orientée objet) sous
Eclipse. Ce TP est accompagné d'un court document de synthèse des principaux concepts de POO: " POO - Principaux Concepts de la
programmation à objets en Java.doc"
Travail pratique n°1 : création d'une classe Point
Enoncé: un point se caractérise par ses coordonnées, qui vont être des variables d'instance de la classe qu'on va définir. On va
ajouter progressivement des méthodes, permettant: de construire un point, d'accéder et de modifier ses coordonnées, de le
déplacer, de le permuter.
A travers ces manipulations nous allons étudier et revoir les concepts de base de la programmation objet en Java, en utilisant l'IDE
Eclipse.
Etape 1: créer un nouveau projet Java. Appelez le par exemple TP SLAM2 1.1
Note: SLAM2 indique le module, 1.1 indique que c'est le 1er TP de la 1ère séquence.
Etape 2: placez vous dans le répertoire src de votre projet, puis créez un nouveau package (File --> New --> Package). Appelez le
espace
Etape 3: créez une classe nommée Point, en se plaçant dans le package espace nouvellement créé. Cette fois ci, ne pas cocher la
case "main".
Etape 4:ajoutez 2 variables d'instance, qui vont représenter les coordonnées d'un objet de type Point de la classe Point.
Appelez les abscisse et ordonnee.
Dans un premier temps, déclarez les public.
public int abscisse, ordonnee ;
Etape 5: création d'un constructeur pour la classe Point
Allez dans le menu Source--> Generate Constructor using Fields
Vérifiez que toutes les variables d'instance sont cochées.
Cliquez sur "Omit call to default constructor super()" (ceci dit, le laisser
décocher ne pose pas de problème).
Etape 6: utilisation de cette 1ère classe Point
a. Retournez à la racine du projet
b. Créez un nouveau répertoire de source, nommé "manipulation".
File --> New --> Source folder
c. Placez vous dans ce répertoire nouvellement créé, manipulation, puis
créez une nouvelle classe, nommé Manipulation
d. Creez une nouvelle classe, nommé Manipulation.
File --> New --> Class
Cf ci dessous la copie d'écran. remarquez qu'on n'a rien inscrit dans le champ
de saisie "Package" et qu'on a coché la case à cocher "public static void
main(String[] args)"
Dans la partie main, tapez les instructions suivantes: cf le résultat ci
dessous:
public class Manipulation {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point monPoint = new Point(1,1) ;
}
}
Question 1: la ligne apparaît avec une erreur dans la marge. Pourquoi ? Que
faut il faire pour y remédier ? Corriger le problème.
1
Par exemple: sous le répertoire de sources nommé "manipulation", créez un nouveau package nommé espace (le nom doit être le
même qu'à l'étape 2), puis déplacez votre classe java Manipulation.java dans ce package.
Etape 7: modification des coordonnées de la Classe Point.
On souhaite modifier les coordonnées de l'objet monPoint. On va modifier la classe Manipulation.java qui instance et utilise un objet
de la classe Point.
Enfin on souhaite afficher les coordonnées de l'objet monPoint.
On va ajouter les instructions suivante:
monPoint.abscisse = 3 ;
monPoint.ordonnee = 3 ;
// On affiche les coordonnées de l'objet monPoint
System.out.println("L'abcisse est "+monPoint.abscisse);
System.out.println("et l'ordonnee est "+monPoint.ordonnee);
Pour utiliser un raccourci ou définir son propre raccourci pour écrire l'instruction System.out.println ...
Astuce: Windows --> Preferences --> Java --> Editor --> Templates
Au final, on aura le code suivant:
package espace;
public class Manipulation {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point monPoint = new Point(1,1) ;
// On souhaite modifier les attributs abscisse et ordonnee de notre objet monPoint
monPoint.abscisse = 3 ;
monPoint.ordonnee = 3 ;
// On affiche les coordonnées de l'objet monPoint
System.out.println("L'abcisse est "+monPoint.abscisse);
System.out.println("et l'ordonnee est "+monPoint.ordonnee);
}}
Question 2: ces instructions sont techniquement bonnes mais abominables en programmation Objet. Pourquoi n'utiliserez vous plus
jamais de telles instructions ?
a. Pourquoi peut on modifier directement des variables d'instance de la classe Point ? que faut il faire pour y remédier ?
b. Comment accéder "proprement" aux variables d'instance de la classe Point ?
c. Comment afficher "proprement" les coordonnées d'un objet de la classe point ?
Etape 8: Mise au propre des classes Point.java et Manipulation.java
a. Dans la classe Point.java, modifier l'accessibilité des variables abscisse et ordonnee en les passant de public à private
Question 3: retournez à ce moment là dans votre classe Manipulation.java. Un certain nombre d'erreurs apparaissent. pourquoi ?
b. Dans la classe Point.java, ajouter des accesseurs aux variables abscisse et ordonnee
Effectuez: Source --> Generate Getters et Setters . L'écran ci dessous
s'affiche.
c. Ajoutez une méthode qui va:
- s'appeler affichePoint
- ne rien prendre en paramètre
- ne rien retourner
- afficher l'abscisse et l'ordonnée
d. Dans la classe Manipulation.java, effacez le code qui modifiait les
coordonnées et remplacez le par du code valide qui utilise les méthodes
d'accès qu'on vient de définir.
Afficher les coordonnées de monPoint avant le changement et après le
changement.
2
Travail pratique n°2 : de l'impossibilité d'échanger (permuter) 2 valeurs de variables primitives
Enoncé: nous allons examiner les difficultés que posent des méthodes traditionnelles de programmation structurée. Ici, nous allons
essayer d'échanger la valeur de 2 entiers et voir le problème posé.
Etape 1: créer un nouveau projet Java. Appelez le par exemple TP SLAM2_ExoEchanges
Note: celui là on ne soigne pas son nom car il est pas beau on le gardera pas forcément, on se souviendra juste de ce qu'il permet
de conclure.
Etape 2: placez vous dans le répertoire src de votre projet, puis créez un nouveau package (File --> New --> Package). Appelez le
echanges
Etape 3: créez une classe nommée Util, toujours en se plaçant dans le répertoire src de votre projet. Cette fois ci, ne pas cocher
la case "main".
Etape 4: Entrez le code suivant: ci dessous le code intégral de la classe.
package Echanges;
class Util
{ public static void echange (int premiere_valeur, int deuxieme_valeur) // ne pas oublier static
{ System.out.println ("debut echange : " + premiere_valeur + " " + deuxieme_valeur) ;
int intermediaire ;
intermediaire = premiere_valeur ;
premiere_valeur = deuxieme_valeur ;
deuxieme_valeur = intermediaire ;
System.out.println ("fin echange
: " + premiere_valeur + " " + deuxieme_valeur) ;
}
}
Etape 5: Remettez vous à la racine du package echanges. Créez une classe nommée Echanges. Cette fois ci, cocher la case
"main".
Etape 6: Dans la méthode "main", ajoutez le code suivant
int ours = 100, taureau = 200 ;
System.out.println ("avant appel
Util.echange (ours, taureau) ;
System.out.println ("apres appel
: " + ours + " " + taureau) ;
: " + ours + " " + taureau) ;
Question 1: Exécutez le code. Que fait le programme ? Est ce le résultat attendu ? Pourquoi ?
Question 2: Dans l'étape 6, il y a quelque chose de nouveau qui devrait vous interpeller. Qu'est ce que c'est ? Que pouvez vous
dire sur le sujet après mes explications ?
Travail pratique n°3 : méthode de permutation de Points
Enoncé: nous allons utiliser des objets et voir comment en échanger (permuter) au travers de l'exemple de notre classe Point. pour
se faire, nous allons ajouter une méthode à notre classe point permettant d'échanger 2 points.
Etape 1: revenir dans le projet TP SLAM2 1.1et ouvrir la classe Point
Etape 2: ajout d'une méthode permute
On ajoute la méthode suivante dans la classe Point
public void permute (Point a)
// methode d'echange les coordonnees du point courant avec celles de a
{
Point intermediaire = new Point(0,0) ;
//copie de a dans intermediaire
intermediaire.abscisse = a.abscisse ;
intermediaire.ordonnee = a.ordonnee ;
//copie du point courant dans a
a.abscisse = abscisse ;
a.ordonnee = ordonnee ;
//copie de intermediaire dans le point courant
abscisse = intermediaire.abscisse ;
ordonnee = intermediaire.ordonnee ;
}
Question 1: Aidez vous des commentaires dans le programme pour expliquer ce que fait cette méthode ?
3
Question 2: Ouvrez maintenant la classe Manipulation.java.
a. Créez 2 objets de type Point, pointA et pointB, de coordonnées (3,4) pour le 1er Point et (5,6) pour le 2ème
b. utilisez la méthode affichePoint pour afficher chacun de ces points
c. Utilisez la méthode permute définie à l'étape 2 pour les permuter
d. affichez à nouveau les 2 points
e. exécutez le programme. Tout s'est il bien passé ?
Travail pratique n°4 : ajout d'une méthode distance à la classe Point
Enoncé: on souhaite ajouter une méthode appelée distance à la classe Point.
La signature de cette méthode sera:
public double distance(Point p)
Question 1: ajouter la méthode distance à la classe Point.
Astuce: on s'aidera de la méthode
Math.sqrt
Question 2: ajouter la méthode distance à la classe Point.
Question 3: dans la classe Manipulations.java, ajoutez une (ou plusieurs) instruction pour afficher la distance entre les points
pointA et pointB définis dans la partie Travail pratique n°3.
Travail pratique n°5 : ajout d'une méthode deplace à la classe Point
Enoncé: on souhaite ajouter une méthode appelée deplaceAuPoint à la classe Point.
La signature de cette méthode sera:
public Point deplaceAuPoint(Point p)
Question 1: ajouter la méthode deplaceAuPoint à la classe Point.
Question 2: ajouter la méthode deplaceAuPoint à la classe Point.
Question 3: dans la classe Manipulations.java, créez 2 nouveaux Points, pointDepart et pointArrivee, de coordonnees (4,6) et (7,8).
Ecrire les instruction pour déplacer le Point pointDepart jusqu'au Point pointArrivee.
Travail pratique n°6 : surcharge de méthodes
Enoncé: on souhaite manipuler des Points parfois en 1 dimension, 2 dimensions ou même en 3 dimensions, sans avoir à définir des
classes différentes.
Etape 1: dans la classe Point.java, ajouter une variable d'instance cote (qui correspond à la 3ème dimension, z).
Etape 2: initialisez les 3 dimensions à 0
Etape 3: générez les méthodes get et set pour la 3ème dimension
Etape 4: ajoutez 2 constructeurs (Source --> Generate Constructor Using Fields) , un avec la variable d'instance abscisse seulement
et un avec les 3 variables d'instance.
Question 1: créez 3 nouveaux points dans la classe Manipulation, nommés point1D et de coordonnées (8), point2D et de
coordonnées (5,8) et point3D de coordonnées (3,5,8).
Pourquoi la construction de ces 3 points est possible ?
Question 3: modifier la méthode affichePoint pour tenir compte de la 3ème dimension cote
Question 4: modifier la méthode permute pour tenir compte de la 3ème dimension cote
Question 5: modifier la méthode distance pour tenir compte de la 3ème dimension cote
Question 6: comment modifier les variables d'instance, le constructeur et les méthodes
4
Téléchargement