IG12
Cours
du 21/02/06 : Les relations entre classes
Une
application réalisée selon l'approche objet est constituée d'objets qui
collaborent entre eux pour exécuter des traitements. Ces objets ne sont donc
pas indépendants, ils ont des relations entre eux. Comme les objets ne sont que
des instances de classes, il en résulte que les classes elles-mêmes sont
reliées.
Deux
classes sont en association lorsque certains de leurs objets ont besoin
s'envoyer des messages pour réaliser un traitement.
Une
association possède, comme en MERISE, des cardinalités, qui représentent le
nombre d'instances impliquées.
Exemple
de représentation en UML
ATTENTION,
les cardinalités (appelées également valeurs de multiplicité) en UML sont
toutes inversées par rapport à MERISE.
Un
compte a une personne comme propriétaire, mais une personne n'a pas forcément
de compte (si c'est un prospect par exemple).
L'association porte un nom « est
propriétaire » et le signe « < » indique le sens de lecture.
Exemple
: (notation simplifiée des classes)
Remarque : Les valeurs de multiplicité
« 0..* » sont parfois traduites par simplement le symbole
« * » et les valeurs de multiplicité « 1..1 » sont parfois
traduites par le symbole « 1 »
Valeurs
de multiplicité possibles :
1..1 |
Un
et un seul |
1 |
Un
et un seul |
0..1 |
Zéro
ou un |
m..n |
De
m à n |
* |
De
zéro à plusieurs |
0..* |
De
zéro à plusieurs |
1..* |
De
un à plusieurs |
Traduction
en java :
Les associations entre classes sont tout simplement représentées par des références. Les classes associées possèdent en attribut une ou plusieurs références vers l'autre classe.
Le
nombre de référence dépend de la cardinalité. Lorsque la cardinalité est 1 ou
0..1, il n'y a qu'une seul référence de l'autre classe
Exemple
:
public class Compte{
private int numero;
private float solde;
private
Personne proprietaire; //l'attribut
proprietaire est une référence sur la classe Personne
public Compte(int num, Personne propr){ //constructeur
numero = num;
proprietaire = propr;
solde = 0;
}
public void crediter( ){
…
}
… //autres méthodes
}
public class Personne
{
private
String nom;
private
String prenom;
private
float revenu;
private Compte cpt; //l'attribut cpte est une référence à un objet Compte
public Personne(String n, String p, float r)
{
nom =
n;
prenom
= p;
revenu
= r;
}
//autres
méthodes
}
Remarque : cpt n’est pas initialisé dans le constructeur
car une personne peut ne pas avoir de compte
Et si une personne pouvait avoir plusieurs comptes?
Dans la classe personne, on n'aurait plus une seule
référence d'un compte, mais un ensemble de références vers des objets comptes
-
Soit
sous la forme d'un tableau (si le nombre de compte est fixé dès le départ)
- Soit sous la forme d'une collection (ArrayList), qui est un type de tableau particulier dont la taille peut varier.
class Personne
{
private
String nom;
private
String prenom;
private
float revenu;
private ArrayList comptes = new ArrayList();
…
}
Voilà comment on traduirait le fait qu'une personne
peut avoir de plusieurs comptes.
Attention : la collection de comptes est
construite, mais pas les comptes à l’intérieur !
Interprétation des modèles UML
Ci-après,
vous trouverez les grandes lignes de passage entre un modèle UML et Java dans
ses cas les plus courants.
UML |
JAVA |
Cas d'association un à un. |
public class A{ private B leB; } public class B{ private A leA; } |
Association de un à n. |
public
class A{
private ArrayList lesB = new ArrayList
; } public
class B{
private A leA; } |
Navigabilité
restreinte. |
public
class A{
private ArrayList lesB = new ArrayList
; } public
class B{
// pas de référence à un objet de la classe A } |
Notion
de rôle dans un diagramme UML :
Les
classes jouent un rôle dans l'association Le
nom de l'association traduit la nature du lien entre les objets de classes :
" La personne est propriétaire d’un compte ". On peut être amené à préciser le rôle que joue chaque classe dans l'association, notamment lorsqu'un couple de classe est relié par deux associations sémantiquement distinctes: |
|
Navigabilité
entre associations.
On
peut assimiler une association comme une relation permettant un parcours de
l'information. On "passe" d'une classe à l'autre en parcourant les
associations; ainsi par défaut les associations sont "navigables"
dans les deux sens. Il peut être pertinent au moment de l'analyse de réduire
la navigabilité à un seul sens. Commentaire: On peut considérer que le
train n'a pas besoin de "connaître" son conducteur. |
|
|
|
Conclusion et extensions: Nous
avons vu que les classes peuvent être en relation entre elles. Dans
ce résumé de cours, nous n’avons vu que des relations d’associations. Il y en
a d’autres (la dépendance, l’héritage, l’agrégation) qui seront vues
ultérieurement. De
même, les relations d’associations peuvent être plus complexes. Une classe d’association
peut être porteuse de propriétés et elle peut participer à d’autres relations. Une
association peut aussi concerner plus de 2 classes comme indiqué sur le
schéma représentant une association ternaire matérialisé par un losange |
|
||