DESS IDC
Introduction à la programmation
orientée objet
Le langage JAVA
TP de programmation : Visages (1) (auteur Pierre Habraken)
Notions de base de la programmation par objets
Dernière modification : 10 février
1999, Philippe Genoud
L'objectif de ce TP est de mettre en oeuvre les techniques et les concepts
élémentaires relatifs à la programmation orientée
objet. Le travail demandé consiste à construire un programme
d'animation d'objets graphiques.
1. Travail demandé
1.1. Cahier des charges
On se propose de réaliser un programme d'animation d'objets graphiques
simples. Le programme doit afficher des objets représentant chacun
un visage stylisé composé à partir de formes géometriques
élémentaires telles que segments, cercles, etc., puis animer
ces visages (déplacements, changements d'expression, ...).
Compte tenu du peu de temps disponible, le logiciel se limitera à
l'affichage et à la manipulation de deux visages de même type
(classe). Il devra toutefois pouvoir être facilement étendu
pour prendre en compte un nombre plus important de visages de types différents.
Ceci suppose donc une spécification et une conception soignées
des composants dont il sera constitué.
1.2. Utilisation de classes prédéfinies
On dispose de types d'objets prédéfinis sous la forme de
classes Java compilées et exécutables. Dans un premier temps
(exercices 1 et 2), le programme utilisera la classe prédéfinie
Visage
à partir de laquelle sera créé un exemplaire unique
qu'il s'agira d'afficher et d'animer à l'écran selon des
trajectoires rectilignes.
Lorsque l'animation d'un visage unique fonctionnera comme souhaité,
le programme sera modifié afin de prendre en compte l'animation
simultanée de deux visages différents, selon des trajectoires
elles-mêmes différentes (exercice 3).
L'affichage des visages à l'écran a lieu dans une fenêtre
graphique. Cette fenêtre est gérée sous la forme d'un
objet de type Dessin.
Les principes de base concernant la création et l'utilisation
des objets sont rappelés en fin de sujet dans la section Classes
et objets : rappels.
1.3. La classe Visage
Le type Visage est caractérisé par les propriétés
et les opérations représentées sur le schéma
ci-dessous.
La propriété dessin permet de relier chaque objet Visage
au Dessin dans lequel il est affiché.

1.3.1 Méthodes de la classe Visage
Les opérations (méthodes Java ) applicables aux objets de
la classe Visage sont les suivantes :
-
public void deplacer(int abcisse, int ordonnee)
Déplace l'objet depuis sa position courante jusqu'au point de
coordonnées : abcisse et ordonnee.
-
public void resterImpassible()
Donne au visage une expression impassible
-
public void sourire()
Donne au visage une expression gaie
-
public void pleurer()
Donne au visage une expression triste
Les objets de type Visage sont automatiquement retracés lorsque
leur expression ou leur position est modifiée par votre programme
au moyen de l'une des méthodes ci-dessus.
1.3.2. Constructeur de la classe Visage
Les objets de type Visage sont créés et initialisés
au moyen d'un constructeur unique :
-
public Visage(Dessin dessin, int abcisse, int ordonnee,
int largeur, int hauteur)
Crée un visage dans le Dessin référencé
par le paramètre dessin, visage dont les coordonnées
et les dimensions initiales sont fixées par les paramètres
abcisse,
ordonnee,
largeur
et hauteur.
La position d'un objet de type Visage est définie par la position
du centre de symétrie du visage représenté. Ses dimensions
sont celles du rectangle (imaginaire) dans lequel s'inscrit le visage.
1.4. La classe Dessin
Les objets graphiques sont tracés dans une fenêtre
graphique au moment voulu et de façon automatique. Cette fenêtre
est un objet créé à partir de la classe Dessin
qui vous est fournie. L'objet de type Dessin que vous créerez dans
votre programme prendra en charge tout ce qui concerne l'affichage à
l'écran de vos objets graphiques.
L'origine des coordonnées dans le "dessin", c'est à dire
dans la fenêtre d'affichage, est située en haut et à
gauche de la fenêtre. Les abcisses croissantes vont vers la droite,
les ordonnées croissantes allant vers le bas de la fenêtre.
1.4.1. Méthodes de la classe Dessin
Les opérations qui sont applicables à l'objet de type Dessin
et dont vous pourrez avoir besoin dans ce TP sont au nombre de trois :
-
public int getLargeur()
La méthode getLargeur() renvoie un entier représentant
la largeur effective de la surface d'affichage de l'objet de type
Dessin
auquel elle est appliquée.
-
public int getHauteur()
La méthode getHauteur() renvoie un entier représentant
la hauteur effective de la surface d'affichage de l'objet de type
Dessin
auquel elle est appliquée.
-
public void pause(int duree)
L'exécution de cette méthode suspend l'exécution
du programme pendant la durée duree, exprimée en
millisecondes. Cette méthode permet un réglage simplifié
de la vitesse d'animation des objets graphiques affichés.
Remarque : la fenêtre graphique gérée par l'objet
Dessin est susceptible d'être redimensionnée à tout
instant par l'utilisateur. En conséquence, les programmes utilisant
la classe Dessin ne doivent faire aucune hypothèse sur
les dimensions de la fenêtre graphique sous-jacente; ils doivent
au contraire utiliser les méthodes getLargeur() et getHauteur()
de la classe Dessin pour obtenir les dimensions effectives de
la surface d'affichage de cette fenêtre.
1.4.2. Constructeurs de la classe Dessin
Un objet Dessin peut être créé et initialisé
au moyen des constructeurs suivants :
-
public Dessin()
Ce constructeur crée une fenêtre sans titre dont les dimensions
initiales par défaut sont 512x512.
-
public Dessin(String titre)
Ce constructeur crée une fenêtre dont le titre ext fixé
par le paramètre titre et dont les dimensions initiales
par défaut sont 512x512.
-
public Dessin(String titre, int largeur, int hauteur)
Ce constructeur crée une fenêtre dont le titre ext fixé
par le paramètre titre et dont les dimensions initiales
sont fixées par les paramètres largeur et hauteur.
2. Déroulement du TP
Avant de commencer le travail demandé, créez un répertoire
tpvisages1
dans lequel vous recopierez les fichiers suivants :
-
TpVisages.jar
: un fichier jar (java
archive) qui contient les bytecode
(.class) des classes Visages,
Dessin et autres classes
qui ont été préparées pour vous pour la réalisation
de ce TP.
-
AppliVisages1.java
: un fichier qui contient le squellete de l'application que vous aurez
à réaliser.
(Pour récupérer ces fichiers : clic bouton droit sur le
lien)
2.1. Exercice n°1
Il consiste à faire se déplacer un visage dans le dessin
selon les deux directions opposées : Nord-Ouest -> Sud-Est et Sud-Est
-> Nord-Ouest, toutes deux orientées à 45° par rapport
aux axes principaux du dessin et confondues avec la deuxième bissectrice
du plan.
 |
Le fichier ExTpVisages1.classcontient
le code compilé d'une classe réalisant cet exercice. Pour
voir le résultat attendu de votre programme vous pouvez recopier
ce fichier sur votre répertoire de travail (clic bouton droit sur
le lien) et lancer son exécution depuis une fenêtre de commandes
(Commandes MS-DOS ou Cygwin B20). Pour exécuter cette classe, la
machine virtuelle a besoin des des classes Dessin,
Visage
définies dans le fichier TpVisages.jar. On utilisera donc
la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar"
ExTpvisages1
où c:/TEMP/tpvisages1 est le répertoire
où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal
KILL (séquence de touches ^C) dans la fenêtre de
commandes à partir de laquelle l'exécution a été
lancée. |
Les actions essentielles que doit exécuter le programme sont
:
Créer et initialiser un objet Dessin ainsi qu'un objet
Visage.
Exécuter une boucle sans fin d'animation du visage :
-
Lorsque le visage atteint un bord du dessin, la direction de son déplacement
doit être inversée
-
L'aspect du visage doit être différent selon qu'il est en
phase de descente ou de montée (par exemple : "triste" lorsqu'il
se déplace vers le bas et "gai" lorsqu'il se déplace vers
le haut).
Les déplacements du visage doivent s'adapter correctement aux modifications
éventuelles des dimensions de la fenêtre d'affichage effectuées
par l'utilisateur du programme.
Après avoir défini un algorithme répondant à
l'énoncé de cet exercice, insérez le code de votre
programme dans le fichier squelette AppliVisages1.java.
Pour compiler puis exécuter la classe AppliVisages1.java
avec le JDE depuis NTEmacs il est nécessaire d'indiquer dans
les options de la ligne de commandes de javac et java
un classpath indiquant le chemin d'accès au fichier TpVisages.jar
contenant les classes Dessin et Visage nécessaires
à votre application. Pour plus de détails sur les opérations
à effectuer suivez ce lien : configuration
du jde pour le tp visages 1.
Lorsque ce premier exercice est terminé, vous pouvez passer à
l'exercice suivant.
2.2. Exercice n°2
Ce deuxième exercice va consister à donner au visage qui
se déplace dans la fenêtre graphique une trajectoire moins
répétitive, plus "aléatoire", selon les quatre
directions Nord-Ouest -> Sud-Est, Sud-Ouest -> Nord-Est, Sud-Est -> Nord-Ouest
et Nord-Est -> Sud-Ouest :
 |
Le fichier ExTpVisages2.classcontient
le code compilé d'une classe réalisant cet exercice. Vous
pouvez recopier ce fichier sur votre répertoire de travail (clic
bouton droit sur le lien) et lancer son exécution depuis une fenêtre
de commandes (Commandes MS-DOS ou Cygwin B20) par la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar"
ExTpvisages2
où c:/TEMP/tpvisages1 est le répertoire
où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal
KILL (séquence de touches ^C) dans la fenêtre de
commandes à partir de laquelle l'exécution a été
lancée. |
La direction du déplacement sera modifiée à chaque
rencontre du visage avec un bord.
Outre son déplacement, le visage sera animé d'un changement
d'expression à chaque changement de direction.
Pour réaliser cet exercice, recopiez le programme précédent
dans un nouveau fichier appelé AppliVisages2.java
puis modifiez le contenu du fichier AppliVisages2.java
jusqu'à obtenir le résultat demandé.
2.3. Exercice n°3
Dans ce troisième exercice, il faut parvenir à animer simultanément
plusieurs visages, deux au moins :
 |
Le fichier ExTpVisages3.classcontient
le code compilé d'une classe réalisant cet exercice. Vous
pouvez recopier ce fichier sur votre répertoire de travail (clic
bouton droit sur le lien) et lancer son exécution depuis une fenêtre
de commandes (Commandes MS-DOS ou Cygwin B20) par la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar"
ExTpvisages3
où c:/TEMP/tpvisages1 est le répertoire
où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal
KILL (séquence de touches ^C) dans la fenêtre de
commandes à partir de laquelle l'exécution a été
lancée. |
Recopiez le programme de l'exercice 2 dans un nouveau fichier appelé
AppliVisages3.java
puis appliquez les modifications nécessaires au contenu du fichier
AppliVisages3.java.
Quelle modification de la structure du programme ou des classes fournies
peut-on suggérer pour éviter ici certaines duplications de
code inutiles et gênantes pour la maintenance du programme ?
3. Classes et objets : rappels
3.1. Création des objets
Les objets d'un même type manipulés par une application logicielle
sont des exemplaires "fabriqués" à partir d'un modèle
unique, modèle représenté par une classe.
Tous les objets sont utilisés et manipulés au moyen des
méthodes de la classe dont ils sont un exemplaire.
La création d'un objet est obtenue au moyen de l'opérateur
new
appliqué à la classe dont on veut fabriquer un exemplaire.
Exemple :
Client unClient = new Client(nom, adresse);
La partie droite de l'expression d'affectation : new Client(nom, adresse)
est une sous-expression dont l'évaluation provoque :
-
la création d'un objet de la classe Client,
-
L'initialisation de cet objet au moyen des valeurs désignées
par nom et adresse passées en paramètres.
-
Le renvoi du nom interne du nouvel objet créé, résultat
de l'évaluation.
Après l'évaluation de l'affectation proprement dite, la variable
unClient
contient le nom interne (la référence) du nouvel objet.
L'initialisation de l'objet est effectuée par le code d'une méthode
spéciale appelée constructeur. Cette méthode
est définie dans la classe concernée et porte toujours
le nom de cette classe, ici Client.
Les paramètres formels déclarés pour cette méthode
spéciale doivent permettre d'initialiser correctement les caractéristiques
(propriétés) de chaque nouvel objet créé.
Plusieurs constructeurs peuvent exister pour une même classe :
chacun d'eux permet dans ce cas d'initialiser d'une façon différente
les valeurs des propriétés de l'objet créé.
Chaque constructeur d'une classe donnée possède donc une
liste d'arguments différente de celle des autres constructeurs de
la même classe. En revanche, tous les constructeurs d'une classe
donnée portent un même nom : celui de la classe.
3.2. Utilisation des objets
Une fois créé, un objet peut être utilisé par
un programme (ou par un autre objet). L'utilisation d'un objet peut répondre
selon le cas à différents besoins :
-
Interrogation ou affectation de la valeur d'une propriété
de l'objet. Ex :
// affiche le solde du compte du client
System.out.println(unCompte.getSolde());
// rend visible une forme géométrique
leCercle.setVisible(true);
On peut noter ici que les environnements de programmation modernes (IDE)
adoptent de plus en plus souvent la convention suivante pour la désignation
des méthodes d'accès aux propriétés caractéristiques
d' un objet :
-
get<nom de la propriété> pour l'interrogation
(sélecteur de propriété)
-
set<nom de la propriété> pour l'affectation d'une
valeur (modificateur de propriété)
-
Opération modifiant l'état global de l'objet
// crédite le compte du client de la somme de 10000F
unCompte.credit(10000);
-
Utilisation d'un service. Ex :
Important : quel que soit le cas, l'utilisation ou la manipulation
d'un objet se fait au moyen des opérations ou méthodes qui
ont été définies pour cet objet dans la classe (le
modèle) dont il est issu.