Cette page a pour simple objectif d'être une sorte de fiche récapitulative relative à UML. Nous supposons que vous savez ce qu'est la programmation objet.
Ce document est toujours en cours de rédaction... Il n'a aucune prétention à devenir une "référence".
Si vous faites de la programmation (pas seulement), il faudra sûrement penser à comment concevoir votre logiciel avant de vous lancer tête baissée dans le code. En effet, la manière de coder est conditionnée par la structure du problème.
UML est un langage qui permet de montrer les liens qu'entretient votre logiciel ou plus simplement un objet de la vie courante. En effet, il est possible de tout modéliser tant que les objets restent des concepts connus : une entreprise, un système électrique, un logiciel de compression, un dictionnaire...
Pour décrire, UML utilise 13 diagrammes. Ceux implémentés dans ArgoUML sont listés ci-dessous. C'est un logiciel gratuit et multi-plateforme pour tracer des diagrammes. Tous les schémas ont été réalisés avec cet outil.
Les autres diagrammes non traités sont :
Ce diagramme est le plus connu, donc le plus utilisé. Il va nous permettre de modéliser notre système. Par exemple, la classe MachineACafe aura des liens logiques avec les classes Filtre et Recipient. Chaque classe sera caractérisée par des propriétés. Ce graphique est donc purement structurel.
C'est notre élément de base qui désigne des choses qui ont des caractéristiques communes : par exemple une Renault et une Peugeot sont avant tout une Voiture. La classe est différenciée en objet après avoir été instanciée (opérateur NEW pour Java et C++). La classe est nommée avec une majuscule et contient le nom (au-dessus), les variables (au milieu) et les méthodes (au-dessous). Ces deux dernières ont différentes portées : privée (-), publique (+) ou protégée (#).
ArgoUML ne présente pas ces signes, mais dans l'exemple ci-dessous, la classe Voiture est définie par une "marque" privée. On y accède en lecture avec getMarque() et en écriture avec setMarque().
En effet, pour éviter que l'utilisateur ait à gérer des cas tordus, getMarque() et setMarque() encapsulent des traitements qui peuvent être complexes. A titre d'exemple, si on modifie la marque, le faire sur les papiers ne suffit pas, car il faut changer le logo sur le capot, avertir le constructeur... On peut imaginer tout ce qu'on veut, et la méthode setMarque() regroupe ces modifications massives avec prudence.
C'est un texte rattaché à une classe ou une méthode qui expose une contrainte le plus souvent. Le trait de lien est en pointillés.
Elle désigne un lien entre des classes qui ont une valeur équivalente. Plus discrètement, dès qu'une classe est déclarée dans les variables d'une autre classe, il y a relation.
On a ici une relation 1-n (notée aussi 1-0..*) parce qu'une personne peut posséder plusieurs voitures. Et comme on peut connaître le propriétaire du fait de la carte grise, on a une association qui va dans les deux sens.
Voici un exemple pour lequel l'association est directionnelle :
Le concessionnaire possède plusieurs voitures (non considérées comme partie), mais le client ne loue pas toujours la même chaque jour. Le fait de connaître la voiture n'indique pas qui l'a loué, sauf en demandant au concessionnaire. La relation 1->n dit que le client peut louer plusieurs voitures à la fois (cas d'une entreprise). Cette flèche est la navigabilité.
Lorsque l'association fait penser à une sous-partie, il y a aggrégation. C'est un lien dont on peut se passer : un siège, une roue, un GPS...
Ici, la Voiture utilise un tableau de sièges dont toutes les cellules ne sont pas nécessairement affectées : il peut être vide ou plein.
Ici, la relation est forte, car ce ne sont pas des gadgets mais des éléments essentiels qui conditionnent les durées de vie.
En gros, si notre moteur recherche n'a pas initialisé ses bases de données, on peut considérer qu'il ne fonctionnera pas. C'est critique, donc en noir.
La différence entre agrégation et composition est mince et sujette à débat.
Il est possible d'avoir deux objets qui ont des critères similaires, à quelques différences près. Une voiture tunée est avant tout une voiture, mais une voiture ordinaire n'est pas tunée. Par conséquent, le tunage est une spécificité d'une voiture tunée qui dispose de tout ce qu'a une voiture normale.
Hériter, c'est se spécialiser et redéfinir le fonctionnement de certaines méthodes.
Par héritage, seules les variables et méthodes protégées (#) ou publiques (+) seront accessibles à VoitureTunee. Tout ce qui est privé reste propriété de Voiture. N'oublions pas que VoitureTunee peut redéfinir la portée des éléments dont elle a hérité.
VoitureTunee est vue comme un cas particulier de Voiture. Les relations avec d'autres classes sont donc conservées par héritage.
Le comportement ou fonctionnement peut être guidé par une classe externe. Ici, une modification de la réglementation influe sur l'attitude du conducteur et des caractéristiques des voitures (troisième feu, feu de recul...).
Le marqueur est une flèche en tirets. Il représente donc l'utilisation d'une classe référencée par un pointeur.
C'est un ensemble réutilisable (un groupe d'objets le plus souvent) qui s'inclut dans un autre projet. C'est à l'image d'un plugin ou d'un framework de développement.
Un paquet est souvent dédié à une tâche précise, et donc ne contient que les objets nécessaires à cette tâche. Le contenu est varié et importe peu tant qu'il répond aux besoins.
Le nommage d'un paquet se fait souvent comme l'adresse d'un site web mais écrit à l'envers. Par exemple: fr.free.ecrucru.vehicules
Ce diagramme permet de faire le point sur les besoins de l'utilisateur. Aucune compétence informatique n'est exigée.
C'est une personne qui va interagir avec le système.
C'est une action qu'il est possible de réaliser et que le système doit savoir gérer. Elle se représente avec une ellipse et utilise un verbe à l'infinitif.
C'est un rectangle qui délimite acteurs et actions. Toutes les actions sont incluses dans le système.
Sur ce schéma, le garagiste hérite du client (flèche creuse). En effet, il peut être un client mais il a surtout la faculté spécifique de savoir réparer des voitures.
On voit également un cas interne qui ne dépend pas des acteurs : Vérifier le paiement. La flèche est en pointillé et doit être complétée par un stéréotype (sorte d'attribut assigné au lien) :
Dans notre exemple, si le garagiste ne fait pas crédit, on utilisera <<includes>>. S'il fait crédit mais veut parfois vérifier que le client a les moyens de payer, on utilisera <<extends>>.
Ce diagramme met en valeur l'évolution du système lorsqu'il est soumis à des évènements extérieurs. On ne se soucie guère du fonctionnement interne.
Un exemple d'application serait le passage d'un état marche à arrêt dès l'appui sur le bouton d'urgent (l'événement extérieur).
Les outils utilisés ressemblent au GRAFCET.
Une situation dans laquelle se trouve notre système.
C'est ce qui permet de changer d'état. Le sens de navigation est donné nécessairement par une flèche.
Lorsqu'on change d'état, il faut parfois faire des trucs en plus. Par exemple, si je suis le système et que je rentre dans le bureau, il faudra peut-être que je pose mon manteau avant de passer dans l'état "travaille dans le bureau".
Avec "entry", on effectue une action à l'entrée dans l'état. Avec "exit", elle se fait en sortant. Entre les deux, on utilise "do".
Pour notre voiture :
Quand l'objet est créé (opérateur NEW), il est dans son état initial.
L'état final correspond parfois à la fin de vie de l'objet.
Il est impossible de revenir au point initial.
On met entre crochets la condition qui permet de franchir la transition.
La conséquence se met après une barre oblique.
La jonction permet de regrouper des liens qui pointent vers la même cible. C'est esthétique et rien ne peut se produire au niveau du point.
Si une transition opère un choix (1+ entrée et 2+ sorties), on met en place un choix.
ArgoUML représente la jonction avec un losange et le choix avec un rond, alors qu'a priori, c'est l'inverse.
Le passage d'une fourche force le système à être dans plusieurs états à la fois. Il ne peut sortir de cet état qu'une fois les conditions de chaque état vérifiées.
C'est utile pour synchroniser des états.
On peut emboîter les états les uns dans les autres.
Bientôt ou à l'occasion...
Dernière modification le 30 juin 2012 à 21:08