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 de dépendance.
C'est la relation la moins contraignante. Elle est unidirectionnelle et définie
une relation d'utilisation. Dans une collaboration d'objets, cela correspond
à l'envoi de message paramétré par un objet d'une autre classe.
Relation de d'association.
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.
Les relations entre classes avec C#
Les
tableaux avec C#.
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.
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,
C# 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 une référence, 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( )
{
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 C# propose des structures de données plus souple et plus performantes les tableaux, les collections.
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.