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.

 

 

Relation d’association :

 

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