Les dia­grammes de classes sont des dia­grammes de structure au sein du Unified Modeling Language, abrégé UML. Le langage de mo­dé­li­sa­tion UML est une norme ISO. Il illustre les systèmes de pro­gram­ma­tion orientés objet. Les processus d’affaires peuvent également être clai­re­ment en­re­gis­trés. En utilisant des moyens visuels, UML montre les états des systèmes et décrit les in­te­rac­tions entre les éléments du système. La notation définit les formes et les lignes pour 14 types de dia­grammes.

Dia­grammes de classes dans le contexte du langage de mo­dé­li­sa­tion unifié

La mé­ta­mo­dé­li­sa­tion décrit à la fois les éléments in­di­vi­duels du langage de mo­dé­li­sa­tion et le langage lui-même. Il définit des unités lin­guis­tiques pour dif­fé­rents niveaux. Une unité de parole dans ce langage visuel est, par exemple, le com­por­te­ment. Il décrit à la fois une mé­ta­classe et un terme générique pour tous les facteurs dy­na­miques d’un système. Une autre unité de langage est l’objet, l’élément de base de la pro­gram­ma­tion orientée objet. Les dia­grammes de classes UML mo­dé­li­sent les objets comme des instances de classes. Le diagramme de classes est donc l’un des types de dia­grammes les plus im­por­tants et les plus fré­quem­ment utilisés en UML.

Les types de dia­grammes sont divisés en deux grandes ca­té­go­ries selon leur fonction : les dia­grammes de structure et les dia­grammes de com­por­te­ment. Ces derniers ont une sous-catégorie : les dia­grammes d’in­te­rac­tion. Ceux-ci ne mo­dé­li­sent pas seulement le com­por­te­ment général d’un système, mais se con­centrent également sur les flux d’in­for­ma­tions entre les objets au cours d’un processus. Ceci inclut, par exemple, les dia­grammes de séquence. Vous modélisez l’ordre chro­no­lo­gique des messages qui circulent dans un cas d’uti­li­sa­tion détaillé. Les dia­grammes de com­por­te­ment vi­sua­li­sent les processus dy­na­miques. Un exemple en est le diagramme d’activité. Ceci montre comment les actions in­di­vi­duelles in­te­ra­gis­sent dans un processus. Les dia­grammes struc­tu­rels, par contre, montrent les états statiques : ils il­lustrent les éléments d’un système et leurs in­ter­dé­pen­dances.

Le diagramme de classes affecte des instances d’objets à des classes spé­ci­fiques en fonction de leurs pro­prié­tés, il existe donc une dé­pen­dance hié­rar­chique. En même temps, il existe des relations entre dif­fé­rentes classes ou entre objets.

Dia­grammes de classes UML : domaines d’ap­pli­ca­tion

Les dia­grammes de classes re­pré­sen­tent des états avec des éléments de système. Ils montrent les struc­tures jusqu’à la plus petite instance. Par con­sé­quent, ils sont adaptés à la pré­sen­ta­tion d’ar­chi­tec­tures lo­gi­cielles dé­tail­lées. Des étapes concrètes de pro­gram­ma­tion peuvent en être déduites. Certains en­vi­ron­ne­ments de pro­gram­ma­tion supportés par logiciel con­ver­tis­sent ces dia­grammes UML di­rec­te­ment en trames de code. Le partage d’équipe permet aux dé­ve­lop­peurs de com­mu­ni­quer entre eux ou avec d’autres décideurs au sein d’une en­tre­prise. Un diagramme UML fournit une vue d’ensemble des struc­tures de système ou des flux de processus planifiés pour ceux qui ne sont pas familiers avec le sujet. Il peut également être utilisé pour formuler les exigences du système, que les dé­ve­lop­peurs mettent ensuite en œuvre. Les pro­fes­sion­nels de l’in­for­ma­tique peuvent modéliser et modifier ef­fi­ca­ce­ment les dia­grammes entre eux sans avoir à pro­gram­mer des en­vi­ron­ne­ments ou des processus plus vastes pendant la phase de pla­ni­fi­ca­tion.

Ce sont les domaines d’ap­pli­ca­tion des dia­grammes de classes :

  • Ils décrivent les types au sein d’un système. La re­pré­sen­ta­tion graphique peut être trans­fé­rée dans dif­fé­rents langages et en­vi­ron­ne­ments de pro­gram­ma­tion. Il existe donc in­dé­pen­dam­ment de l’ap­pli­ca­tion future.
  • Vous modélisez les ar­chi­tec­tures lo­gi­cielles exis­tantes. Si des com­po­sants sup­plé­men­taires doivent être intégrés, ils vi­sua­li­sent les struc­tures ap­pro­priées sur les­quelles de nouveaux com­po­sants peuvent être installés. Pour les futurs éléments du système, les dia­grammes de classes créent une ligne di­rec­trice pour le code du programme. Selon les besoins, cette étape peut être sommaire ou très détaillée.
  • Ils re­pré­sen­tent des modèles de données. Ils sont adaptés à des systèmes de com­plexité variable.
  • Avec des ap­pli­ca­tions im­bri­quées, la do­cu­men­ta­tion et la main­te­nance peuvent devenir très complexes. Les dia­grammes de classes four­nis­sent une vue d’ensemble du schéma.
  • Ils re­pré­sen­tent les exigences lo­gi­cielles. En tant que fichiers image, ils peuvent être fa­ci­le­ment trans­fé­rés via les canaux internes de l’en­tre­prise. Ils per­met­tent ainsi à des experts de dif­fé­rents dé­par­te­ments d’échanger des in­for­ma­tions sur l’ar­chi­tec­ture.
  • Le standard UML utilise des dia­grammes de classes pour vi­sua­li­ser sa propre notation.

Dia­grammes de classes : notation selon UML

Les dia­grammes de classes UML sont cons­ti­tués de classes et de leurs instances (objets) ainsi que d’in­ter­faces. Ils éta­blis­sent des relations hié­rar­chiques et des as­so­cia­tions entre ces éléments. La notation de ce type de diagramme est l’élément de base de la plupart des autres dia­grammes de structure. UML 2 définit les dia­grammes de structure comme des clas­si­fi­ca­teurs. Dans la mé­ta­mo­dé­li­sa­tion UML, les dia­grammes de package, les dia­grammes de com­po­sants et autres sont des sous-classes du diagramme de structure. Cependant, ceci n’est pas modélisé, puisqu’il s’agit d’une classe abstraite. Le diagramme de classes est mieux utilisé comme exemple de diagramme de structure. D’autres dia­grammes de cette catégorie utilisent des com­po­sants modifiés du diagramme de classes pour leur notation.

Remarque

En tant que clas­si­fi­ca­teur, UML comprend une mé­ta­classe abstraite. Il est utilisé pour affecter des éléments de modèle dans le langage de mo­dé­li­sa­tion à un concept commun. C’est ce que l’on appelle la gé­né­ra­li­sa­tion. La norme peut donc être formulée en termes généraux. Si la spé­ci­fi­ca­tion traite d’un certain élément, seule cette par­ti­cu­la­rité doit être expliquée.

La classe

La classe est un élément de modèle dans le diagramme de classes et une spé­cia­li­sa­tion de l’En­cap­su­la­ted­Clas­si­fier et du Be­ha­vio­red­Clas­si­fier. Elle résume beaucoup d’exemples. Les instances d’objets d’une classe ca­rac­té­ri­sent les mêmes ca­rac­té­ris­tiques (attributs) et com­por­te­ments (méthodes). De plus, elles ont la même sé­man­tique, c’est-à-dire qu’elles utilisent les mêmes signes avec la même sig­ni­fi­ca­tion. La classe est donc une sorte de modèle pour ses objets. Elle instancie les objets et définit leur com­por­te­ment dans le système.

Remarque

L’instance est l’ex­pres­sion concrète d’un élément abstrait. Elle exécute un com­por­te­ment prescrit dans les pa­ra­mètres. Certaines instances sont ex­pli­ci­te­ment nommées par UML. L’objet en fait partie. Les pro­prié­tés des instances sont mo­dé­li­sées avec des dia­grammes au niveau des instances. Au lieu de dessiner un diagramme de classes, vous pouvez dessiner un diagramme d’objets, par exemple.

Les clas­si­fi­ca­teurs en­cap­su­lés étendent les clas­si­fi­ca­teurs dits struc­tu­rés. Ces derniers se ca­rac­té­ri­sent par le fait qu’ils peuvent prescrire une structure à l’intérieur et reprendre des éléments connectés. Ces éléments (mé­ta­classe : Con­nec­ta­bleE­le­ments) in­fluen­cent le com­por­te­ment des clas­si­fi­ca­teurs. Chaque élément associé re­pré­sente un par­ti­ci­pant dans le com­por­te­ment du clas­si­fi­ca­teur. Ils disent aussi qu’ils jouent un rôle. Le clas­si­fi­ca­teur encapsulé dispose d’un port d’amarrage sup­plé­men­taire. Cela permet d’isoler le clas­si­fi­ca­teur du système sans perdre la connexion.

Les clas­si­fi­ca­teurs com­por­te­men­taux ont souvent une connexion à une interface, l’In­ter­fa­ce­Rea­li­za­tion. Le clas­si­fi­ca­teur accepte im­pli­ci­te­ment les con­di­tions de l’interface en prenant en charge la fonc­tion­na­lité de l’interface. Vous dessinez l’In­ter­fa­ce­Rea­li­za­tion (aussi appelé « Lollipop ») comme un cercle non rempli qui est relié à la classe par une ligne.

Ces mé­ta­classes clas­si­fient les objets. La classe est l’ex­pres­sion spé­ci­fique de ces mé­ta­classes. De cette façon, elle définit plus pré­ci­sé­ment la clas­si­fi­ca­tion et con­cré­tise les com­po­sants in­di­vi­duels qui composent la structure et le com­por­te­ment des objets. Les classes ont des pro­prié­tés qui les décrivent (et leurs objets su­bor­don­nés). Cela comporte :

  • Ca­rac­té­ris­tiques (Pro­per­ties ou At­tri­butes, s’ils ap­par­tien­nent à la classe)
  • Opé­ra­tions (Ope­ra­tions pouvant être appelées pour un objet)
  • Ré­cep­teurs de signaux (Re­cep­tions) depuis UML 2.0
  • Con­nexions (Ports) depuis UML 2.0
  • Con­nec­teurs (Con­nec­tors)

Vous ajoutez ces pro­prié­tés à la notation lorsque vous créez un diagramme de classes. En UML, une classe est re­pré­sen­tée par un rectangle avec une ligne continue. Son corps se compose de trois com­par­ti­ments disposés les uns au-dessus des autres. Seule la partie su­pé­rieure doit être modélisée, car vous spécifiez ici le nom de la classe. Les deux autres par­ti­tions peuvent op­tion­nel­le­ment être éti­que­tées avec des attributs (centre) et des opé­ra­tions (bas). Vous attribuez une vi­si­bi­lité dif­fé­rente à ces éléments en écrivant les symboles suivants devant leur nom :

  • + = public
  • - = privé
  • # = protégé
  • / = dérivée
  • ~ = Paquet
  • * = aléatoire

Pro­prié­tés (ca­rac­té­ris­tiques)

Les pro­prié­tés sont des éléments connectés. Les attributs de classe (ow­ne­dAt­tri­butes) sont toujours des rôles. Ils sont reliés entre eux par des con­nec­teurs. S’ils ont la propriété is­Com­po­site= true (« est composé = true »), ils sont appelés parties.

La propriété UML est une ca­rac­té­ris­tique struc­tu­relle qui a plusieurs domaines d’ap­pli­ca­tion. En plus de la fonction en tant qu’attribut dans une classe, elle peut également re­pré­sen­ter des fins d’as­so­cia­tion.

Le type de propriété est dérivé du nom du clas­si­fi­ca­teur. Si vous le souhaitez, vous pouvez définir une valeur par défaut pour une ca­rac­té­ris­tique. De plus, les mo­di­fi­ca­teurs dé­ter­mi­nent plus en détail le com­por­te­ment d’une ca­rac­té­ris­tique :

  • ordonné (notation : isOrdered = true)
  • unique (notation : isUnique = true)
  • non unique (notation : isUnique = false)
  • lecture seule (la ca­rac­té­ris­tique ne peut être lue, notation : is­Rea­dOnly = true)
  • Séquence (la ca­rac­té­ris­tique est une col­lec­tion ordonnée, notation : isUnique = faux et isOrdered = vrai)
  • As­so­cia­tion (as­so­cia­tion dérivée de sous-ensembles, notation : union)
  • ID (ap­par­tient à la dé­sig­na­tion de son clas­si­fi­ca­teur, notation : id)
  • Dé­li­mi­ta­tion du caractère (une dé­li­mi­ta­tion qui influence le caractère, notation : propriété-con­trainte)
  • Re­dé­fi­ni­tion d’une ca­rac­té­ris­tique (redéfinit une ca­rac­té­ris­tique héritée, nommée, notation : redéfinit [nom de la ca­rac­té­ris­tique])
  • Sous-ensemble de la ca­rac­té­ris­tique (symbolise une ca­rac­té­ris­tique qui est un sous-ensemble d’une ca­rac­té­ris­tique nommée, notation : sous-ensembles [nom de la ca­rac­té­ris­tique])

Opé­ra­tions

Les opé­ra­tions sont des fonctions com­por­te­men­tales. Ils se pro­dui­sent dans les classes, mais aussi dans les types de données ou les in­ter­faces. Vous appelez di­rec­te­ment l’instance d’une classe. L’opération détermine les aspects suivants d’un appel :

  • Nom
  • Type
  • Pa­ra­mètres
  • Con­traintes

L’opération ap­par­tient à son clas­si­fi­ca­teur supérieur. Ceci peut les modifier en re­dé­fi­nis­sant le type ou le paramètre.

Il y a des con­di­tions préa­lables à l’opération. Ces con­di­tions doivent être remplies avant l’exécution de l’opération. Toutefois, UML ne définit pas le com­por­te­ment d’un appel de com­por­te­ment si les con­di­tions préa­lables ne sont pas remplies. Vous dé­fi­nis­sez également les con­di­tions ul­té­rieures qui doivent être remplies lorsque l’opération est terminée. Les con­di­tions cor­po­relles limitent le résultat de sortie à une valeur calculée à partir de leurs spé­ci­fi­ca­tions. Cette valeur doit répondre aux con­di­tions a pos­te­riori. Toutefois, l’opération peut également provoquer une exception pendant son exécution. Dans ce cas, il ne remplit pro­ba­ble­ment pas les con­di­tions post con­di­tion­nelles.

La notation pour le diagramme de classe prescrit que les opé­ra­tions dans un com­par­ti­ment sont notées dans le corps de la classe. Selon le standard UML, ces in­for­ma­tions sont obli­ga­toires. En même temps, UML permet de supprimer toutes les spé­ci­fi­ca­tions standards d’une classe. Seul le nom doit être noté.

Récepteur de signaux

Un récepteur de signal indique qu’un clas­si­fi­ca­teur est prêt à accepter un signal. Il définit également les types de signaux que les instances de la classe acceptent. Le récepteur de signal porte le même nom que son signal. Vous notez les in­for­ma­tions cor­res­pon­dantes dans le corps de la classe, dans un com­par­ti­ment sous les opé­ra­tions.

Ports

Il s’agit de ports pour les clas­si­fi­ca­teurs en­cap­su­lés. Ils re­pré­sen­tent un point d’in­te­rac­tion entre le clas­si­fi­ca­teur et son en­vi­ron­ne­ment. Outre les ports, le clas­si­fi­ca­teur encapsulé est un système autonome. Étant donné que ses éléments struc­tu­rels et com­por­te­men­taux internes ne sont pas affectés par le reste du système, vous pouvez également définir ce clas­si­fi­ca­teur in­dé­pen­dam­ment. Tant qu’un système respecte les limites du port, vous pouvez réu­ti­li­ser le clas­si­fi­ca­teur encapsulé dans dif­fé­rents en­vi­ron­ne­ments.

En outre, UML autorise plusieurs points d’ancrage par clas­si­fi­ca­teur. Vous pouvez définir des règles dis­tinctes pour chaque port. Le port est une propriété du clas­si­fi­ca­teur, vous dé­fi­nis­sez donc ses règles dans la zone Pro­prié­tés. Cela inclut les services que le clas­si­fi­ca­teur offre à son en­vi­ron­ne­ment et les services dont il a besoin. Vous dif­fé­ren­ciez les dif­fé­rents flux d’in­for­ma­tion en iden­ti­fiant le port utilisé pour eux.

Les ports eux-mêmes ont aussi des pro­prié­tés. Lorsque le port exécute les fonctions publiées du clas­si­fi­ca­teur, il affiche la propriété isService. Si isService = true, le port est considéré comme un composant in­dis­pen­sable des fonctions du clas­si­fi­ca­teur encapsulé qui sont visibles de l’extérieur. Avec isService = false, le port n’est pas l’une des ca­rac­té­ris­tiques es­sen­tielles et peut donc être modifié ou supprimé tout comme les autres fonctions internes.

Les ports in­te­ra­gis­sent avec les in­ter­faces. Il existe des in­ter­faces fournies et né­ces­saires (voir « In­ter­faces » ci-dessous). L’interface qui est connectée au port spécifie les in­te­rac­tions qui passent par le port. Comme le site d’amarrage est une propriété, il a un type. La valeur d’is­Con­ju­ga­ted sert de médiateur entre le type et l’interface du port. Si la valeur est vraie, l’interface requise peut être dérivée di­rec­te­ment du type de port ou de l’ensemble des in­ter­faces que le type de port im­plé­mente. Dans ce cas, une interface fournie est dérivée du nombre d’in­ter­faces. Si is­Con­ju­ga­ted est vrai, l’interface fournie est dérivée du type.

Lorsqu’un clas­si­fi­ca­teur encapsulé génère une instance, des instances cor­res­pon­dantes sont créées pour chacun de ses ports. Un port tient l’instance en fonction de son type et de sa mul­ti­pli­cité (voir ci-dessous). Les instances sont appelées points d’in­te­rac­tion UML. Chaque instance possède des ré­fé­rences uniques qui dis­tin­guent les dif­fé­rentes demandes de fonctions com­por­te­men­tales adressées à ses ports.

Ports avec la propriété is­Be­ha­vior = true envoie une requête à l’instance du clas­si­fi­ca­teur encapsulé. La requête adopte le com­por­te­ment spécifié de l’instance. Les ports de com­por­te­ment ne dirigent pas les requêtes vers l’intérieur de votre clas­si­fieur. Si aucun com­por­te­ment n’est défini dans le diagramme de classes pour cela, les messages sont perdus sur ces ports.

Modéliser un port comme un petit carré sur le cadre du clas­si­fieur auquel il ap­par­tient. Dessinez l’interface requise ou fournie sur le port. Si vous ne spécifiez aucune ca­rac­té­ris­tique spéciale pour le port, dessinez l’interface sans le port.

Con­nec­teurs

Les con­nec­teurs dé­fi­nis­sent les con­nexions entre deux ou plusieurs instances. Le cahier des charges permet leur com­mu­ni­ca­tion. Con­trai­re­ment aux relations telles que les as­so­cia­tions, les con­nec­teurs ne con­nec­tent que les instances qui sont définies comme pièces de connexion. Modéliser les con­nec­teurs en tant que bords avec au moins deux ex­tré­mi­tés. Ils re­pré­sen­tent les instances par­ti­ci­pantes qui at­tri­buent un type aux éléments liables.

Mul­ti­pli­cité

Un autre paramètre important est la mul­ti­pli­cité. Ce paramètre spécifie le nombre d’instances qu’une classe struc­tu­rée peut former. Il limite également les attributs et les opé­ra­tions. C’est une partie de la structure interne, c’est un élément prescrit dans le corps de la classe. Vous le saisissez après les attributs et les opé­ra­tions. Topologie ap­par­tient également à cette section. Les nœuds (instances d’objets) se con­nec­tent aux réseaux to­po­lo­giques par des voies de com­mu­ni­ca­tion (Com­mu­ni­ca­tion­Paths).

Notez les mul­ti­pli­ci­tés comme suit :

<mul­ti­pli­cité> : <plage de mul­ti­pli­cité> [<dé­sig­na­tion de commande> , <iden­ti­fiant unique>]

La plage de mul­ti­pli­cité spécifie une valeur fixe ou une plage de début à fin :

  • 0 = la classe ne forme pas d’instances (se produit rarement)
  • 0..1 = soit aucune instance, soit une seule instance
  • 1 ou 1...1 = exac­te­ment une instance
  • 0..* ou seulement * = aucune instance ou plus avec valeur ouverte
  • 1...* = une ou plusieurs instances avec valeur ouverte

L’ordre et l’unicité peuvent être exprimés par un ensemble (quantité) ou par des termes in­di­vi­duels séparés par des virgules. Selon la manière dont les nœuds du set sont uniques ou commandés, le set reçoit une des­crip­tion type. Dans la notation, vous décrivez les tailles in­di­vi­duelles comme étant com­man­dées/non com­man­dées ou uniques/non uniques.

Type de quantité Unique Commandé
Séquence Non Oui
Multi-quantité (Sac) Non Non
Quantité commandée Oui Oui
Quantité Oui Non

Con­trainte

La con­trainte doit également être men­tion­née ici. Dans les versions an­té­rieures d’UML, cet élément était l’une des relations. Pendant ce temps, UML définit la res­tric­tion comme un élément packable. Cela signifie qu’elle peut ap­par­te­nir di­rec­te­ment à un paquet. Elle établit également de telles relations avec d’autres éléments, tels que les classes ou les ca­rac­té­ris­tiques. Toutefois, cela n’influence pas la notation. La res­tric­tion constitue une condition ou une garantie de son pro­prié­taire. Elle peut affecter un ou plusieurs éléments.

L’élément pro­prié­taire doit avoir accès à la res­tric­tion. Il vérifie ainsi si la res­tric­tion est valable et si elle a été respectée. Cela dépend du pro­prié­taire quand cela se produit. Certains éléments, comme l’opération, vérifient les con­traintes avant, pendant et/ou après l’exécution. Il existe des con­di­tions préa­lables, des con­di­tions cor­po­relles et des con­di­tions pos­té­rieures. La spé­ci­fi­ca­tion du moment où un élément vérifie sa con­trainte s’appelle un contexte en UML. Une dis­tinc­tion est faite entre le contexte et la spé­ci­fi­ca­tion réelle. Ce dernier décrit l’élément qui délimite la con­trainte, l’aspect qu’il évalue et le résultat qu’il attend. La spé­ci­fi­ca­tion exacte est donnée à une con­trainte par une spé­ci­fi­ca­tion de valeur booléenne.

La notation se compose d’une chaîne de texte sous la forme suivante :

<Nom de l’élément restreint> ::= { <Nom de la con­trainte> : <ex­pres­sion booléenne> }

UML ne prescrit pas de langage. Vous pouvez choisir dans quelle langue vous souhaitez définir la res­tric­tion lorsque vous créez votre diagramme de classes. Utilisez un langage de pro­gram­ma­tion comme Java, un langage naturel ou un langage lisible par machine comme XML. Le Groupe de gestion des objets, qui définit le standard UML, publie l’Object Cons­traint Language (OCL). Ce langage définit les con­traintes com­pa­tibles UML. Son avantage est qu’il s’intègre par­fai­te­ment dans la notation.

Vous notez certains éléments res­treints dans l’UML comme texte, par exemple, un attribut d’une classe dans le diagramme de classes. Vous notez la res­tric­tion derrière l’élément de texte entre crochets courbes. Si le pro­prié­taire est un élément que vous re­pré­sen­tez comme un symbole, placez la res­tric­tion le plus près possible du symbole ; il devrait être évident que les deux éléments ont une relation sé­man­tique. Vous pouvez rendre la connexion encore plus claire en écrivant la res­tric­tion dans une icône de bloc-notes et en la con­nec­tant à son pro­prié­taire avec une ligne poin­til­lée.

Si la res­tric­tion affecte deux éléments, connectez les pro­prié­taires avec une ligne poin­til­lée. Vous écrivez la res­tric­tion entre pa­ren­thèses courbes dessus. Si vous placez une pointe de flèche à une extrémité, cela indique la position du pro­prié­taire dans une col­lec­tion d’éléments con­traints. La flèche pointe de la première position vers la seconde. Si plus de deux éléments ont la res­tric­tion, utilisez l’icône du bloc-notes et associez chaque élément à la res­tric­tion.

Les bords font également partie des éléments res­tric­tifs. Si vous modélisez plus de deux bords du même type, faites glisser la ligne poin­til­lée de con­trainte à travers tous les bords qui re­pré­sen­tent les éléments impliqués.

Sté­réo­types

Les sté­réo­types dé­fi­nis­sent les ex­ten­sions des mé­ta­classes. Selon la spé­ci­fi­ca­tion UML, ils ap­par­tien­nent aux profils. Si un sté­réo­type décrit des pro­prié­tés sup­plé­men­taires de plusieurs mé­ta­classes, il ne peut décrire qu’une seule instance de la mé­ta­classe à la fois pendant l’exécution. Parmi les mé­ta­classes, le sté­réo­type joue un certain rôle. Parce qu’il ne peut jamais rester seul. Ils mo­dé­li­sent un sté­réo­type toujours en con­jonc­tion avec le clas­si­fi­ca­teur qu’il développe. Vous connectez la mé­ta­classe au sté­réo­type en mo­dé­li­sant une extension.

Note

Depuis UML 2.4 la spé­ci­fi­ca­tion est définie : l’étiquette d’un sté­réo­type est écrite avec une lettre majuscule au début, environ <<Type>>. Les autres éti­quettes, par exemple pour les pro­prié­tés à la fin des as­so­cia­tions, sont écrites en mi­nus­cules.

Il existe deux types de relations entre la (méta)classe et les sté­réo­types. L’extension requise (notation : is­Re­qui­red = true) définit qu’un sté­réo­type se connecte à chaque instance de la mé­ta­classe dans le diagramme de classes. L’extension inutile (notation : is­Re­qui­red = false) permet d’associer librement des instances de la mé­ta­classe à un sté­réo­type. Vous pouvez également supprimer le sté­réo­type. Toutefois, une instance par­ti­cu­lière ne peut être liée à un sté­réo­type par­ti­cu­lier qu’une seule fois pendant l’exécution.

Si vous voulez supprimer un sté­réo­type, supprimez le profil qui le définit dans la zone (ap­plied­pro­files) du package parent. Vous pouvez également supprimer l’instance qu’il étend.

UML définit certains sté­réo­types de classes qui étendent votre diagramme de classes UML. Six sté­réo­types sont standards. Trois sté­réo­types, souvent utilisés mais pas nor­ma­li­sés, sont ceux avec lesquels vous mettez en œuvre le modèle « Model-View-Con­trol­ler » (MVC) en UML. Les trois sté­réo­types non standards sont :

  • L’entité (notation : <>) : le sté­réo­type Entité définit une classe ou un objet. Chaque instance re­pré­sente une col­lec­tion de données. Il s’agit souvent de données système qui doivent être stockées pendant une période plus longue. L’entité assume le rôle du modèle à partir du modèle MVC. UML connaît ce sté­réo­type, mais l’affecte par défaut aux dia­grammes de com­po­sants. La notation fré­quem­ment utilisée n’énumère pas la spé­ci­fi­ca­tion. Ils mo­dé­li­sent l’entité comme un cercle reposant sur une courte ligne.
  • La limite (notation : <>) : la limite est un sté­réo­type pour une classe ou un objet. Il cor­res­pond à peu près à l’élément View du motif MVC. La limite modélise la limite de votre système, par exemple une interface uti­li­sa­teur. Ils sont gé­né­ra­le­ment re­pré­sen­tés sous la forme d’un cercle, à partir duquel une ligne bifurque vers la gauche, qui rencontre une ligne verticale.
  • L’élément de contrôle (notation : <>) : l’élément de contrôle re­pré­sente les mêmes éléments que le con­trô­leur sous MVC. Des classes ou objets avec des éléments de modèle sté­réo­ty­pés qui cor­res­pon­dent au com­por­te­ment du système ou qui con­trô­lent les flux. Dans le standard UML, le sté­réo­type <> assume des tâches si­mi­laires. Dessinez une instance de contrôle sous la forme d’un cercle avec une flèche ouverte sur la ligne.

Ces trois sté­réo­types peuvent aussi être dessinés comme une simple classe. Dans le rectangle, notez le nom du sté­réo­type respectif. Les mo­dé­li­sa­teurs utilisent prin­ci­pa­le­ment ces formes dans les dia­grammes de séquence. Si vous voulez en savoir plus sur les dia­grammes de contrôle des fron­tières d’entités, lisez notre article sur le diagramme de séquence avec UML.

Ces sté­réo­types stan­dar­di­sés con­vien­nent aux dia­grammes de classes :

  • Focus (<>)
  • Aide (<>)
  • Type (<>)
  • Classe d’ap­pli­ca­tion (<>)
  • Méta-classe (<>)
  • Uti­li­taire (<>)

Focus

La classe focus définit la logique métier de base ou le flux de contrôle des classes d’aide. Ceux-ci sup­por­tent la classe focus, qui connecte un ou plusieurs as­sis­tants. Elle définit im­pli­ci­te­ment les classes de soutien en éta­blis­sant une relation de dé­pen­dance avec elles (voir « La relation dirigée » ci-dessous). Si elle utilise des classes d’aide, elle les définit ex­pli­ci­te­ment. Le standard UML re­com­mande ce sté­réo­type en par­ti­cu­lier pour la phase de con­cep­tion, lorsque vous re­pré­sen­tez les flux de contrôle entre com­po­sants ou dé­fi­nis­sez la logique métier de base.

Remarque

La logique métier, aussi appelée logique ap­pli­ca­tive, décrit la logique d’un système qui traite de l’exécution d’exigences métier réelles. Elle diffère de la logique dictée par l’exécution technique. Dans la pro­gram­ma­tion orientée objet, la logique métier a produit le concept de l’objet métier. Cela permet de modéliser des processus concrets et des valeurs réelles dans un système d’in­for­ma­tion.

Aide

La classe d’aide agit gé­né­ra­le­ment en com­bi­nai­son avec la classe de fo­ca­li­sa­tion. Elle prend gé­né­ra­le­ment en charge les classes qui sont d’une im­por­tance cruciale pour le système. À cette fin, elle exécute des flux de contrôle se­con­daires et définit la logique sub­si­diaire. Si la classe aide supporte une classe focus, la dé­fi­ni­tion est explicite. Vous utilisez une relation de dé­pen­dance pour définir im­pli­ci­te­ment la classe prise en charge.

Type

La classe type définit un domaine pour les objets de gestion. Elle spécifie également les opé­ra­teurs de ces objets. Le sté­réo­type de type peut avoir des attributs et des as­so­cia­tions. Toutefois, il ne décrit pas l’exécution physique de l’objet.

Classe d’ap­pli­ca­tion

Certains langages de pro­gram­ma­tion (par exemple Java ou C++) n’au­to­ri­sent qu’une seule classe pour chaque instance. Avec UML, cependant, vous pouvez assigner une instance à plusieurs classes. La classe d’ap­pli­ca­tion construit un pont entre ces deux mondes. Ce sté­réo­type restreint la classe UML. Il détermine qu’une instance sous lui ne peut réaliser qu’une seule classe. La classe d’ap­pli­ca­tion peut im­plé­men­ter plusieurs types dif­fé­rents à cette fin. Pour exécuter avec succès un clas­si­fi­ca­teur qui lui est affecté, elle doit remplir deux con­di­tions : elle doit fournir toutes les opé­ra­tions du clas­si­fi­ca­teur et elles doivent avoir le com­por­te­ment défini pour le clas­si­fi­ca­teur. Toutefois, il n’est pas né­ces­saire que les attributs physiques et les as­so­cia­tions cor­res­pon­dent.

Mé­ta­classe

Puisque les formes de classe et de mé­ta­classe ne diffèrent pas, l’étiquette Metaclass indique qu’il s’agit du sté­réo­type Me­ta­classe. Les instances de cette classe sont elles-mêmes des classes. Avec ce sté­réo­type, vous tra­vail­lez à un niveau plus élevé d’abs­trac­tion.

Uti­li­taires

La classe utility n’a pas d’instances. Elle n’identifie qu’une col­lec­tion d’attributs et d’opé­ra­tions nommés. Ils sont toujours statiques. Les attributs statiques ne changent pas lorsqu’ils sont appelés. Les opé­ra­tions statiques sont utilisées pour les entités ou les types d’entités. Si vous utilisez la classe uti­li­taire, vous devez spécifier les valeurs et les opé­ra­tions cor­res­pon­dantes dès le départ, car elles ne changent plus. Le sou­lig­ne­ment identifie ces éléments.

Note

UML spécifie des sté­réo­types par défaut sup­plé­men­taires pour d’autres types de gra­phiques. Leurs domaines d’ap­pli­ca­tion et leur notation se trouvent dans la spé­ci­fi­ca­tion UML 2.5.1, Chapitre 22 : profils standard, Tableau 22.1, Page 680.

In­ter­faces

Les in­ter­faces sont des clas­si­fi­ca­teurs. Dans leur notation, elles res­semblent aux classes. Con­trai­re­ment à la classe, il s’agit toutefois de dé­cla­ra­tions, c’est-à-dire qu’elles déclarent un certain nombre de fonctions et d’obli­ga­tions publiques lo­gi­que­ment liées. C’est pour ça qu’elles utilisent un contrat. Si une instance exécute l’interface, elle doit remplir ce contrat. On dit que l’instance offre un service selon le contrat. L’interface elle-même ne forme pas d’instances comme une dé­cla­ra­tion.

C’est là que la classe entre en jeu, parce qu’elle instancie. Votre instance utilise des spé­ci­fi­ca­tions d’interface. Pour cela, elle doit remplir le contrat de l’interface. En retour, elle utilise l’interface comme toile de fond publique. De plus, un clas­si­fi­ca­teur peut utiliser plusieurs in­ter­faces. In­ver­se­ment, une interface dessert également plusieurs clas­si­fi­ca­teurs. Dans le diagramme de classes UML, les notations d’interface et de classes sont si­mi­laires : un rectangle, éven­tuel­le­ment avec trois zones séparées par des lignes.

Pour montrer qu’une classe utilise une interface, utilisez la notation In­ter­fa­ce­Rea­li­za­tion (connue des clas­si­fi­ca­teurs com­por­te­men­taux). Ceci re­pré­sente une interface fournie, c’est-à-dire une interface qui exécute di­rec­te­ment une instance (Provided Interface). Cette dernière s’applique également aux classes su­pé­rieures telles que la com­po­sante. Si la classe a un port public, elle fournit l’interface. Vous re­pré­sen­tez l’In­ter­fa­ce­Rea­li­za­tion avec un cercle qui est relié au clas­si­fi­ca­teur par une ligne.

Il y a aussi des In­ter­faces Requises (Required In­ter­faces). Elles vi­sua­li­sent une relation de dé­pen­dance (voir « Relations » ci-dessous). Un élément a besoin d’un autre élément pour remplir toute la portée de ses propres fonctions. Dans ce cas, un clas­si­fi­ca­teur (ou une de ses instances) a besoin d’une interface. L’In­ter­fa­ceU­sage spécifie les exigences d’interface. Une ligne continue relie le clas­si­fi­ca­teur à un demi-cercle ouvert. Ceci symbolise l’interface. Notez le nom de l’interface aux deux re­pré­sen­tants sous le (demi)cercle.

Si une classe hérite d’une interface à une classe su­bor­don­née, modélisez l’interface qui la lie à la classe ou instance su­bor­don­née. Afficher la relation hié­rar­chique avec l’accent cir­con­flexe (^), par exemple, comme ^Interface 1.

Utilisez la notation de l’interface rec­tan­gu­laire, tracez un bord entre les deux nœuds. Dans le diagramme de classes, les bords mo­dé­li­sent les relations entre classes, instances ou com­po­sants. UML prescrit dif­fé­rentes lignes et flèches pour dif­fé­rentes fonctions et relations. Dans ce cas, connectez une classe avec l’interface requise à l’aide d’une flèche poin­til­lée avec une pointe ouverte. Donnez à la flèche l’étiquette <<use>>. Une interface fournie est reliée à une classe par une flèche en poin­til­lés avec une pointe fermée et non remplie. La flèche pointe toujours dans la direction de l’interface.

Types de données

Les types de données unissent un ensemble d’objets avec leurs opé­ra­tions. Ils utilisent des four­chettes de valeurs concrètes et les combinent avec leurs opé­ra­tions spéciales. Les objets peuvent avoir plusieurs types. Leurs valeurs nu­mé­riques vont des types primitifs aux énu­mé­ra­tions plus longues.

Les types de données sont des clas­si­fi­ca­teurs. Vos instances ne vous iden­ti­fient que par leur valeur. Vous utilisez les types de données pour vi­sua­li­ser les types de valeurs, les types primitifs et les types struc­tu­rés dans le diagramme de classes UML. Si vous copiez une instance de type de données ou modélisez deux instances du même type de données avec la même valeur, elles sont con­si­dé­rées comme étant les mêmes instances.

Si le type de données possède des attributs, UML le classe comme un type de données structuré. Ses instances ne sont égales que si leur structure et les valeurs de leurs attributs sont iden­tiques.

Les types primitifs n’ont pas de structure su­bor­don­née, mais re­pré­sen­tent des valeurs de données atomiques. Ils sont également utilisés dans le diagramme de classes pour les res­tric­tions. Ces types ont gé­né­ra­le­ment une sé­man­tique complexe en dehors de la spé­ci­fi­ca­tion UML. Cependant, en UML ils n’ont pas d’identité, c’est pourquoi ils ne peuvent être dis­tin­gués pour la même valeur. Ce sont quelques types primitifs en UML :

  • Booléen (variables boo­léennes)
  • Entier (nombre entier)
  • Un­li­mi­ted­Na­tu­rall (nombre naturel illimité)
  • Réel (nombres réels)
  • Chaîne (chaîne de ca­rac­tères)

Vous écrivez les types primitifs avec l’étiquette <<primitive>> au-dessus du nom du type de données respectif.

L’énu­mé­ra­tion est un type de données. Elles re­pré­sen­tent la valeur du dé­nom­bre­ment sous la forme d’un symbole de lettre de dé­nom­bre­ment. Comme vous pouvez le voir dans l’image ci-dessus, c’est sim­ple­ment un nom qui symbolise une certaine valeur. C’est à vous de choisir. Dans la liste « Rose Type », par exemple, le nom « Tea Roses » re­pré­sente le nombre de tea roses qu’un fleuriste a dans son as­sor­ti­ment. Dans le diagramme de classes, dessinez ce clas­si­fi­ca­teur avec le symbole de la classe, un rectangle. Le nom et l’étiquette <<enu­me­ra­tion>> sont dans l’en-tête. Ils séparent la zone de la tête du corps par des lignes ho­ri­zon­tales en com­par­ti­ments.

Comme pour les autres classes, l’énu­mé­ra­tion réserve les sections su­pé­rieures pour les attributs et les opé­ra­tions. Si celles-ci sont restées vides, laissez les deux dé­par­te­ments en dehors du diagramme. Dans la partie in­fé­rieure, entrez les symboles de votre lettre d’énu­mé­ra­tion. Par exemple, la liste des espèces de roses chez un fleuriste se compose de la tête intitulée « espèces de roses » ou « Rose Type » dans notre exemple en anglais et du corps avec une liste : roses thé, roses noisette, roses gallica, roses bourbon, roses cannelle.

Relations

Les dia­grammes de classes re­pré­sen­tent les relations entre les éléments du système. De cette façon, le spec­ta­teur peut voir de quels com­po­sants le système a besoin et comment ils s’in­fluen­cent mu­tuel­le­ment. La relation élément UML est une classe abstraite. Elle re­pré­sente l’idée d’une relation entre les com­po­sants du système. Par con­sé­quent, cet élément n’a pas de notation distincte. Cependant, ses ca­rac­té­ris­tiques ont des détails spé­ci­fiques qui les dis­tin­guent.

En UML, les relations sont comprises comme des bords entre nœuds. De cette façon, vous modélisez gé­né­ra­le­ment les relations avec une ligne ou avec des va­ria­tions de celle-ci, comme la flèche.

La dé­fi­ni­tion UML pour les sous-classes et instances de relations a changé ra­di­ca­le­ment d’UML 1 à UML 2. À l’origine, par exemple, il y avait des relations sé­man­tiques, struc­tu­relles et dirigées. UML a affecté trois relations concrètes (as­so­cia­tion, res­tric­tion et dé­pen­dance) aux relations sé­man­tiques. Sous UML 2, les li­mi­ta­tions sont main­te­nant des éléments packables, les as­so­cia­tions dé­fi­nis­sent certaines sources comme des relations struc­tu­relles et sé­man­tiques. La dé­pen­dance fonc­tionne main­te­nant sous des relations dirigées.

Il reste à voir comment la norme changera dans les versions futures. Dans ce qui suit, nous ex­pli­quons les dia­grammes de classes selon UML 2.5. En con­sé­quence, la relation mé­ta­classe a deux sous-classes : la relation dirigée et l’as­so­cia­tion.

L’as­so­cia­tion

L’as­so­cia­tion est une relation qui relie les tulipes. En in­for­ma­tique, les tulipes sont des ensembles ordonnés de valeurs. La connexion logique et la séquence jouent un rôle important. Il n’est donc pas erroné d’attribuer à l’as­so­cia­tion une com­po­sante struc­tu­relle en plus de sa dé­sig­na­tion of­fi­cielle en tant que relation sé­man­tique. L’as­so­cia­tion est un lien entre les clas­si­fi­ca­teurs. Les éléments de cette relation ont une proximité logique ou physique. Selon le nombre de membres, l’as­so­cia­tion est appelée binaire (deux instances), ternaire (trois instances) ou n-aire (à partir de quatre instances).

Les ex­tré­mi­tés d’as­so­cia­tion con­nec­tent les as­so­cia­tions avec les instances du diagramme de classes UML. La fin de l’as­so­cia­tion a un nom de fin. Ce nom exprime le rôle de l’instance dans la relation res­pec­tive. Supposons qu’un élève tourne plusieurs versions d’un court métrage pour un séminaire sur le cinéma. Le rôle de l’étudiant en cinéma dans le film serait alors « créateur ». Le rôle du film serait « travail de séminaire ». Inscrivez le nom sous la ligne de lien, dans chaque cas dans le symbole de l’instance qui le décrit. La fin ap­par­tient soit à l’as­so­cia­tion elle-même, soit au clas­si­fi­ca­teur de la fin. Avec plus de deux buts, le rôle ap­par­tient à l’as­so­cia­tion.

La flèche à côté du nom de l’as­so­cia­tion dans le diagramme de classes su­pé­rieures indique la direction de la relation. Dans le diagramme du bas, le point de l’instance « film » indique que la fin de l’as­so­cia­tion « travail de séminaire » ap­par­tient à l’instance « étudiant en cinéma ». Comme la fin de l’as­so­cia­tion « créateur » n’a pas un tel marquage, il ap­par­tient à l’as­so­cia­tion elle-même. La mul­ti­pli­cité « 1 » indique qu’il existe exac­te­ment un cas d’ « étudiant en cinéma ». L’instance « film » a au moins trois for­ma­tions.

La na­vi­ga­bi­lité est une propriété finale. Il indique si une instance à cette extrémité de l’as­so­cia­tion peut être atteinte à partir de l’autre extrémité de l’as­so­cia­tion. Si l’instance B peut être atteinte par l’instance A, tracez une flèche ouverte sur le bord de l’as­so­cia­tion dans la direction de l’instance B di­rec­te­ment sur le symbole d’instance B. Si l’instance D n’est pas ac­ces­sible par l’instance C, tracez un X sur la ligne de l’instance D. Si vous ne voulez pas spécifier la na­vi­ga­bi­lité, ne dessinez pas de notation séparée.

Il existe deux variantes d’as­so­cia­tion : le lien et l’agré­ga­tion.

  • Le lien est une instance de l’as­so­cia­tion. Il a au moins deux ex­tré­mi­tés, dont chacune a une mul­ti­pli­cité. Cette valeur doit être une instance du type de données des ex­tré­mi­tés. Dans l’exemple ci-dessus, un étudiant en cinéma filme trois films pendant ses études. La valeur pour l’instance « Student » est « 1 ». La valeur pour l’instance « Movie » est « 3 ». Vous modélisez la connexion sous forme de lignes pleines entre les par­ti­ci­pants de la relation. Con­trai­re­ment à l’as­so­cia­tion, le lien relie des instances et non des clas­si­fi­ca­teurs.
  • L’agré­ga­tion est une as­so­cia­tion binaire. Elle a donc toujours deux par­ti­ci­pants. Con­trai­re­ment au lien, il n’établit pas de relations au même niveau. Au lieu de cela, il montre les relations entre une partie et l’ensemble. Vous re­pré­sen­tez l’agré­ga­tion avec une propriété à la fin de l’as­so­cia­tion. Vous modélisez un losange sur l’instance qui re­pré­sente l’ensemble.

Le sous-type Com­po­si­tion (Composite Ag­gre­ga­tion) décrit la relation entre une com­po­si­tion de parties et une partie unique de celle-ci. Si le système supprime le tout (la com­po­si­tion), il détruit également la pièce in­di­vi­duelle. Si, par exemple, un arbre est la chose entière, alors une feuille en fait partie. Si l’arbre est victime d’un feu de forêt, le feu détruit également les feuilles. Par exemple, lorsque vous créez un diagramme de classes et re­pré­sen­tez cette relation, vous tracez une ligne continue entre les instances. Modéliser un losange noir sur le côté de la com­po­si­tion (dans cet exemple : l’instance « arbre »). Cette page est aussi appelée fin d’agré­ga­tion.

Le deuxième sous-type d’agré­ga­tion est l’agré­ga­tion frac­tion­née (abrégée en agré­ga­tion simple). Cette relation asy­mé­trique existe entre une propriété (Property) et une instance qui re­pré­sente un ensemble d’instances. La connexion doit être faite di­rec­te­ment. Sinon, une instance de com­po­si­tion pourrait être in­ter­pré­tée comme faisant partie d’elle-même. Ceci peut se produire si vous modélisez la relation de dé­pen­dance de façon cyclique. La propriété partagée peut ap­par­te­nir à plusieurs com­po­si­tions. En même temps, leur instance peut exister in­dé­pen­dam­ment de la com­po­si­tion. Dans ce cas, si le système supprime une com­po­si­tion (ou la totalité), la substance peut toujours exister. Par con­sé­quent, cette relation est con­si­dé­rée comme faible par rapport à la com­po­si­tion.

L’as­so­cia­tion propose également une par­ti­cu­la­rité : la classe as­so­cia­tion. C’est à la fois une question de classe et de relation. Ceci vous permet d’affecter des attributs à la classe d’as­so­cia­tion dans le diagramme de classes.

La relation di­rec­tion­nelle

La relation dirigée est une classe abstraite. Elle décrit les relations entre une source et une cible. Les deux ex­tré­mi­tés de la relation peuvent avoir des éléments multiples. Comme l’as­so­cia­tion, la relation dirigée n’a pas non plus de notation fixe. Leurs sous-classes forment des formes spé­ci­fiques. Celles-ci sont basées sur une ligne allant de la source à la des­ti­na­tion. Les cas suivants ca­rac­té­ri­sent une relation dirigée :

  • Gé­né­ra­li­sa­tion (Ge­ne­ra­li­za­tion)
  • Dé­pen­dance (De­pen­dency)
  • Reliure par gabarit (Template Binding)
  • Inclure (Include) : ap­par­tient à la notation pour les dia­grammes de cas d’uti­li­sa­tion
  • Etendre (Extend) : fait partie de la notation pour les dia­grammes de cas d’uti­li­sa­tion

La gé­né­ra­li­sa­tion est une relation binaire entre classes. Il est dirigé d’une sous-classe à une su­per­classe, d’une certaine classe à une classe plus générale. La classe par­ti­cu­lière (p. ex. dahlia) a la gé­né­ra­li­sa­tion. Une flèche avec une pointe de flèche fermée mais non remplie pointe de cette source vers la cible. La cible est la classe générale (par ex. fleur composite).

La sous-classe spécifie la classe générale. Cela signifie également que la sous-classe partage certaines pro­prié­tés avec la su­per­classe en termes de contenu aussi bien que de structure, prin­ci­pa­le­ment les éléments de base. Cette cir­cons­tance s’appelle l’héritage. La classe des dahlias, par exemple, partage l’in­flo­res­cence en forme de capitule avec le composite de la classe su­pé­rieure. Une ca­rac­té­ris­tique spé­ci­fique du genre dahlia est ses huit paires de chro­mo­somes, les autres plantes n’ont gé­né­ra­le­ment que deux paires de chro­mo­somes. Les dif­fé­rentes espèces de dahlias pré­sen­tent donc des ca­rac­té­ris­tiques d’aspect plus diverses.

UML permet im­pli­ci­te­ment l’héritage multiple. Cela vous permet de modéliser plusieurs sous-classes qui ont à la fois des su­per­classes communes et dif­fé­rentes. Par ailleurs, il existe plusieurs niveaux de gé­né­ra­li­sa­tion. Vous pouvez afficher ces relations à l’aide de la notation par flèche ou vous pouvez imbriquer les sous-classes dans leurs su­per­classes. Pour ce faire, vous modélisez toutes les sous-classes associées dans le corps de la su­per­classe.

Le set de gé­né­ra­li­sa­tion vous aide à gérer une synthèse dans le diagramme de classes. L’ensemble est un élément packable. Les paquets en UML sont des con­te­neurs pour des éléments nommés qui ont des si­mi­li­tudes sé­man­tiques et qui peuvent changer ensemble. Un paquet est un espace de noms et non une classe. Toutefois, vous pouvez associer le set de gé­né­ra­li­sa­tion à un clas­si­fi­ca­teur. Celui-ci s’appelle un type de pouvoir.

Vous modélisez le type de pouvoir sous la forme d’une chaîne de ca­rac­tères à l’arête de gé­né­ra­li­sa­tion dans ce for­mu­laire : {[is­Co­ve­ring Property],[is­Dis­joint Property]} [Nom du type d’ali­men­ta­tion]. La propriété is­Co­ve­ring spécifie si l’ensemble est complet. Les valeurs sont complètes ou in­com­plètes. La propriété is­Dis­joint indique si les clas­si­fi­ca­teurs partagent des instances communes. Les valeurs sont soit disjoints (pas de che­vau­che­ment), soit over­lap­ping (che­vau­che­ment existant).

Note

La stan­dar­di­sa­tion UML 2.5 donne peu d’in­for­ma­tions sur l’héritage. Cependant, vous pouvez suivre les versions pré­cé­dentes. UML 2 explique gé­né­ra­le­ment que les classes spé­cia­li­sées adoptent les ca­rac­té­ris­tiques et con­traintes de leurs su­per­classes. UML 1.4 spé­cia­lisé qui remplace les attributs déclarés dans une sous-classe d’attributs hérités.

La dé­pen­dance (De­pen­dency) est une relation entre « four­nis­seur » et « client » (supplier-client-re­la­tion­ship). Cette relation dirigée décrit qu’un élément dépend d’un autre élément. Il peut aussi y avoir beaucoup d’éléments. Le client a besoin d’un autre élément pour la spé­ci­fi­ca­tion plus précise ou pour exécuter sa tâche. Sans le pres­ta­taire, le client n’a pas de com­po­sante struc­tu­relle ou sé­man­tique. Par con­sé­quent, les chan­ge­ments de four­nis­seur peuvent avoir une incidence sur le client. Selon UML 2.5, la sé­man­tique influence toujours l’élément mentionné, mais pas ses instances. Les dé­pen­dances jouent un rôle non seulement dans le diagramme de classes UML, mais aussi dans d’autres dia­grammes de structure tels que le diagramme des com­po­sants ou le diagramme de dé­ploie­ment.

La dé­pen­dance comporte trois sous-ca­té­go­ries :

  • Abs­trac­tion (Abs­trac­tion)
  • Dé­ploie­ment (De­ploy­ment)
  • Uti­li­sa­tion (Usage)

L’abs­trac­tion relie des éléments à dif­fé­rents niveaux. Al­ter­na­ti­ve­ment, il montre des pers­pec­tives dif­fé­rentes. Les éléments nommés dans cette relation de dé­pen­dance re­pré­sen­tent le même concept. Selon le standard UML, l’élément le plus spé­ci­fique est le client, qui dépend du four­nis­seur, l’élément le plus abstrait. Ainsi, l’extrémité de la flèche doit être à la sous-classe et le haut à la su­per­classe. UML permet également la notation inverse. Si vous pensez qu’il est plus logique que l’élément abstrait soit dépendant de sa sous-classe, dessinez la flèche sur l’élément plus spé­ci­fique.

L’abs­trac­tion a deux sous-classes : la réa­li­sa­tion (Rea­li­za­tion) et la ma­ni­fes­ta­tion (Ma­ni­fes­ta­tion).

Nous avons déjà mentionné la réa­li­sa­tion en ce qui concerne les in­ter­faces. L’(In­ter­fa­ce­Rea­li­za­tion) est une spé­ci­fi­ca­tion de la réa­li­sa­tion. Il décrit une relation entre le clas­si­fi­ca­teur et l’interface. Le clas­si­fi­ca­teur utilise l’interface pour offrir un service à son client. L’interface exécute ce service. Pour cela, le clas­si­fi­ca­teur doit remplir le contrat stipulé par l’interface. La notation des in­ter­faces fournies et requises se trouve dans la section « In­ter­faces ».

La subs­ti­tu­tion (Subs­ti­tu­tion) est une autre relation qui spécifie la réa­li­sa­tion. Il existe entre un clas­si­fi­ca­teur de rem­pla­ce­ment et un clas­si­fi­ca­teur de contrat. Le clas­si­fi­ca­teur de rem­pla­ce­ment remplit le contrat de l’autre clas­si­fi­ca­teur. Pendant la durée du contrat, les instances du clas­si­fi­ca­teur de rem­pla­ce­ment peuvent remplacer les instances du clas­si­fi­ca­teur de contrat. Con­trai­re­ment à la spé­cia­li­sa­tion, il n’y a pas de si­mi­li­tude struc­tu­relle entre les éléments de subs­ti­tu­tion. Vous notez la subs­ti­tu­tion comme un bord de dé­pen­dance (flèche poin­til­lée avec une pointe ouverte) dans le diagramme de classes et ajoutez le mot-clé <<subs­ti­tute>> au bord.

La valeur de ca­rac­té­ris­tique décrit une relation entre un artefact et un ou plusieurs éléments de modèle. UML définit les artefacts comme des clas­si­fi­ca­teurs. Ils sym­bo­li­sent des instances concrètes et physiques telles que les dossiers d’archives. L’ex­pres­sion signifie qu’un artefact exécute di­rec­te­ment un élément connecté. In­ver­se­ment, il peut sym­bo­li­ser le fait que des éléments soient impliqués dans la création de l’artefact. La spé­ci­fi­ca­tion est un élément du diagramme de dé­ploie­ment et n’est men­tion­née ici que par souci d’ex­haus­ti­vité. Ils né­ces­si­tent la même notation que les rem­pla­ce­ments. Le mot-clé est <<manifest>>.

L’abs­trac­tion définit aussi certains sté­réo­types. Les sté­réo­types ap­par­tien­nent aux profils UML. Si une mé­ta­classe existante doit être étendue pour un projet, un profil est défini pour celui-ci. La classe sté­réo­type est toujours utilisée avec la méta-classe, car un profil ne modifie que ce qui existe ou ajoute de la ter­mi­no­lo­gie. Depuis UML 2.4.1, UML a écrit des sté­réo­types avec des ma­jus­cules au début. Les sté­réo­types standard pour une abs­trac­tion sont :

  • Dériver (<<Derive>>) : un élément dérive d’un autre élément. C’est gé­né­ra­le­ment le même type.
  • Affiner (<<Refine>>) : un élément donne des in­for­ma­tions plus dé­tail­lées pour une classe qui existe également dans l’autre élément. Les éléments sont situés à dif­fé­rents niveaux d’abs­trac­tion. Par exemple, un modèle au niveau de la direction affine sa classe « Employés » par rapport à la classe « Employés » au niveau de la con­cep­tion.
  • Pister (<<Trace>>) : dif­fé­rents modèles expriment dif­fé­rents aspects d’un système. Vous utilisez le mappage ou le traçage pour suivre les éléments qui re­pré­sen­tent le même concept dans dif­fé­rents modèles. Vous pouvez utiliser la trace pour suivre l’évolution des éléments et des spé­ci­fi­ca­tions.
Note

Utiliser ces sté­réo­types d’abs­trac­tion pour établir la relation entre le client et le pres­ta­taire. Ce processus peut être bilatéral ou uni­la­té­ral et formel ou informel. Le mandant et le four­nis­seur sont situés dans des dia­grammes dif­fé­rents, par exemple dans un diagramme de classes et dans un diagramme de cas d’uti­li­sa­tion.

Le dé­ploie­ment montre la relation entre un artefact et son uti­li­sa­tion prévue. Dans le diagramme UML, le bord de dé­ploie­ment d’un ou plusieurs artefacts pointe vers la cible de dé­ploie­ment. Le mot-clé pour le bord est <<deploy>>. Vous pouvez également appliquer cette dé­pen­dance au niveau des instances. Vous pouvez aussi modéliser l’artefact dans le corps de la cible. Pour ce faire, dessinez l’artefact sous forme de symbole ou dressez la liste des artefacts fournis. Cette dé­pen­dance fait partie de la notation des dia­grammes de dé­ploie­ment.

L’uti­li­sa­tion décrit une relation dans laquelle le client a besoin du four­nis­seur pour accomplir ses tâches ou effectuer des opé­ra­tions. L’uti­li­sa­tion im­plé­mente donc la dé­pen­dance générale comme une instance. Cette dé­pen­dance façonne certaines relations concrètes :

  • Utiliser (<<use>>) : un élément utilise un autre élément, mais les par­ti­ci­pants exacts dans la relation et l’avantage exact ne sont pas définis en détail.
  • Créer (<<create>>) : un clas­si­fi­ca­teur client ou un de ses éléments struc­tu­rels ou com­por­te­men­taux crée une ou plusieurs instances du clas­si­fi­ca­teur four­nis­seur.
  • Appeler (<<call>>) : une opération appelle une autre opération. La cible peut être n’importe quelle opération dans l’en­vi­ron­ne­ment de l’opération source, même les clas­si­fi­ca­teurs parents.
  • Envoyer (<<send>>) : une opération est la source, c’est-à-dire le client. Votre cible est un signal. La dé­pen­dance modélise donc que l’opération envoie le signal cible.
  • Interface requise (Required Interface -----C) : con­trai­re­ment à l’interface fournie, l’interface requise n’existe pas dans le clas­si­fi­ca­teur. Il détermine les services dont un clas­si­fi­ca­teur a besoin pour exécuter ses fonctions pour son client. La dé­pen­dance existe entre le clas­si­fieur et l’interface. Pour en savoir plus à ce sujet, consultez la section « In­ter­faces ».

La liaison de modèle est la dernière relation di­rec­tion­nelle utilisée dans le diagramme de classes. Lorsque vous créez un diagramme de classes, il peut parfois être utile de créer des modèles pour vos classes. Pour les classes, les modèles sont cons­ti­tués de pa­ra­mètres de modèle. Ces pa­ra­mètres ap­par­tien­nent à la signature du modèle. La signature détermine l’ensemble ordonné de pa­ra­mètres dans le modèle. Les classes de modèle qui ne né­ces­si­tent pas de pro­prié­tés in­di­vi­duelles fonc­tion­nent plus ef­fi­ca­ce­ment lorsque vous utilisez des modèles. Toutefois, si vous voulez qu’une classe ait des pa­ra­mètres fixes, utilisez le lien modèle. La relation existe entre un élément lié et la signature du modèle dans un modèle cible.

L’élément lié est mo­dé­li­sable, c’est-à-dire qu’il peut devenir un modèle ou être lié à d’autres modèles. L’élément est lié parce qu’il a une connexion à un modèle. Ce lien décrit la structure de l’élément en rem­pla­çant les pa­ra­mètres formels du modèle par des pa­ra­mètres de valeur.

En résumé

Le diagramme de classes est l’un des dia­grammes UML les plus po­pu­laires, car il affiche les struc­tures du système en détail et de manière claire. En tant que diagramme de structure, il montre le système dans un état statique. Cela donne au té­lés­pec­ta­teur une vue d’ensemble des éléments né­ces­saires dans un système. En outre, vous pouvez re­pré­sen­ter les relations entre les éléments cons­ti­tu­tifs de votre ar­chi­tec­ture système. Des objets réels aux classes abs­traites avec des profils en expansion, le diagramme de classes UML vous permet de modéliser in­dé­pen­dam­ment du langage de pro­gram­ma­tion. Comment pro­mou­voir la com­pré­hen­sion entre les dis­ci­plines lors de la mise en œuvre d’un projet.

Aller au menu principal