Les relations entre classes

version pdf

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.