Les relations entre classes avec UML.
Les classes ne valent que par les relations qu'elles tissent entres elles. Cette phase est décisive dans
l'élaboration du modèle statique. Mais c'est à partir des interactions entre les objets que doivent se dessiner les relations entre classes.
Relation d'association.
Soit la situation suivante où différents articles sont stockés dans différents
entrepôts
Diagramme d'objets
Remarque: si la classe de chaque objet est clairement identifié, nous pouvons représenter des objets anonymes, comme instance de classe; dans ce cas le nom de l'objet est remplacé par une instance.
Le diagramme suivant a la même sémantique:
L'association porte un nom
Au niveau des classes, nous pouvons construire une association. Une association relie des classes dont les instances sont sémantiquement liées. Une
association ne sous-entend aucune hiérarchie dans la relation.
Diagramme de classe.
L'association a un nom "Est stockée", le symbole
">" indique seulement un sens de lecture.
L'association suivante est équivalente car elle concerne les mêmes couples d'objets.
Diagramme de classe
Remarque: nous utilisons une forme verbale pour qualifier le nom de l'association.
Les classes jouent un rôle dans l'association
Le nom de l'association traduit la nature du lien entre les objets de classes : " Les lits sont stockés dans l'entrepôt de Montreuil" . On peut être
amené à préciser le rôle que joue chaque classe dans l'association, ici il s'agit des rôles de
"gardien" côté entrepôt et "gardé" côté article.
Mais la notion de rôle prend tout son sens lorsqu'un couple de classe est relié par deux associations sémantiquement distinctes:
Diagramme de classe
Les associations comportent des cardinalités.
Cette notion est identique à celle contenue dans Merise. Dans UML, on parle de
valeurs de multiplicité.
exemple 1.
Interprétation:
Une oeuvre donne lieu à 0 ou n livres. Un livre est issu d'une et une seule oeuvre.
Commentaires:
- Notez le positionnement des multiplicités, inverse de la modélisation Merise
- La multiplicité 0..* est parfois traduite par simplement le symbole *
Exemple 2.
Interprétation.
Une revue est disponible dans un ou plusieurs points de vente.
Un point de vente distribue de une à plusieurs revues.
Commentaire:
- Le nombre de classes participant à l'association définissent l'arité de
l'association. Les deux exemples précédents montrent une association d'arité 2.
Ceci sera le plus fréquent.
Valeurs de multiplicité.
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 |
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.
Association porteuses d'attributs.
L'association entre deux classes peut elle même posséder des attributs. Par exemple:
" Un homme peut avoir été marié plusieurs fois, et réciproquement, les dates et durées des mariages nous importent ".
Les attibuts "date" et "durée" ne concernent pas seulement chaque instance des deux classes mais des couples d'instances. Dans ce cas l'association va jouer
à la fois le rôle d'association et le rôle de classe, on parle alors de classe-association.
Commentaires:
- La présence des "cadenas" provient simplement lu logiciel utilisé - Rose de Rational -, attributs privés.
- La classe-association ne porte pas de valeurs de multiplicité. Chaque instance de la classe-association Mariage est reliée à un couple d'instances des
classes Homme et Femme.
Une classe association peut participer à d'autres relations.
A partir de l'exemple précédent, imaginons que le mariage soit l'objet d'un contrat de mariage type.
Commentaire:
La classe-association Mariage peut participer à des relations propres. Chaque mariage donne lieu ou pas à un contrat type.
Association à arité supérieure à 2.
Reprenons le thème des revues disponibles dans différents points de ventes. Imaginons que nous désirions suivre les disponibilité hebdomadaires.
Commentaire:
- L'association - ternaire ici - est matérialisée par un losange.
- Une valeur de multiplicité minimum à 0 signifierait, par exemple pour la revue, qu'une revue n'a été disponible dans aucun point de vente
quelque soit la
semaine.
Comme pour toute association, elle peut être porteuse d'attributs. Par exemple, ici, enregistrons les ventes hebdomadaires de revues par point de vente.
Commentaire:
Chaque instance de la classe-association Vente, en plus de pointer sur un triplet d'instances des trois classes, contient un attribut.
Exercices
Les relations entre classes avec JAVA
Les
tableaux avec Java.
Vous pouvez définir un tableau en écrivant:
int [ ] unTableau = new int[10];
C'est l'opérateur new qui doit être utilisé pour allouer sur le tas; les tableaux se manipulent comme en C; que l'on peut comparer à l'instruction C:
int * unTableau = new int[10]; //C et C++
le premier indice est 0.
chaque élément est valorisé en
utilisant un indice:
unTableau[5] = 9;
Par contre:
On peut initialiser un tableau à
sa création sans utiliser l'opérateur new
int[] autreTableau ={ 12, 15, 5, 78, 5};
Ce tableau contient 5 éléments et est créé sur le tas.
A l'exécution, Java opère une
vérification de taille; le programme s'arrêtera si l'on tente d'accéder à un
indice hors tableau.
On peut affecter une variable
tableau à une autre variable tableau:
int[] encoreUnTableau = autreTableau;
Mais
attention dans ce cas les deux tableaux réfèrent le même espace mémoire.
Ainsi un tableau est en fait une référence cachée, ce qui va avoir des conséquences sur le passage de paramètres d'arguments type tableau.
Passage de paramètres de type
tableau.
Comme les tableaux sont des références cachées, le tableau passé en paramètre pourra être modifié dans la méthode.
public class testTableau
public static void inverseTableau( int[] t )
{
int longueur = t.length, sauve;
for(int i =0; i< longueur/2;i++)
{
sauve = t [ i ];
t[ i ] = t[ longueur-i -1];
t[ longueur-i -1] = sauve;
}
}
public static void main( String [] args )
{
int [ ] tab = new int[ 10 ];
inverseTableau( tab);
}
}
Remarque: les tableaux offrent certains services comme la valeur length qui retourne la longueur du tableau.
Un tableau comme valeur de retour
d'une fonction.
On peut écrire:
public int[ ] uneFonction(int n)
Une fonction peut retourner un tableau - contrairement à C/C++-.
Interprétation
des modèles UML
Nous allons montrer les grands lignes de passage entre un modèle UML et Java dans ses cas les plus courants.
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 B[ ] tabB = new B[ n ] ;
}
public class B
{
private A leA;
}
Remarque: nous verrons que Java propose une structure de données plus souple que le tableau, le vecteur.
Navigabilité restreinte.
public class A
{
private B[ ] tabB = new B[ n ] ;
}
public class B
{
// pas de référence à un objet de la classe A
}
Pour terminer cette partie, quelques conseils
Maintenir les données privées.
Initialiser toujours les données.
Ne fournissez de méthodes d'accès que si cela est nécessaire.
Utilisez les conventions standards pour nommer classes et méthodes. Un nom de classe doit comporter un substantif : Client, ClientPrivilegie... Les méthodes doivent avoir un nom signifiant, commencer par une lettre minuscule; les méthodes d'accès doivent commencer par get ( getNom() ) et les méthodes d'altération par set ( setNom() ).
Ne faites jouer à la méthode main que le rôle d'instanciation d'objets.