En général, l'examen approchant, le stress monte, et on a tendance à croire que l'on a tout oublié !
J'ai fait cette page pour vous permettre de tester vos capacités, ainsi que pour vous rappeler certain concepts d'UML...
Avec un diagramme de cas d'utilisation, on cherche à décrire le comportement du système (actions et réactions), selon le point de vue de l’utilisateur.
On va donc chercher à décrire le système, ainsi que les relations entre le système et l’environnement.
On peut donc dire que les diagrammes de cas d'utilisations :
La création de ces diagrammes n'est pas facile. La première des erreurs vient du fait que l'on essaye de dire trop de chose dans un seul diagramme. Pour qu'il reste visible, il vaut mieux en faire 2-3, plutôt que d'en faire un seul avec des flèches et des cas d'utilisations partout. Donc, ne pas hésiter à découper un diagramme.
Pour qu'un diagramme de cas d'utilisation soit bien fait, il faut qu'il réponde à ces questions :
Les principales erreurs viennent de ces trois questions... Commencez donc par y répondre, sans chercher à le traduire en diagramme.
Par ailleurs, essayez d'utiliser des verbes pour vos cas d'utilisation.
Répondez aux trois questions précédente pour la situation suivante :
Un client arrive à la caisse avec des articles à acheter. Le caissier enregistre les articles et prend le payement. Le client peut ensuite partir avec les articles.
Solution (cliquez-moi...)
Bon, en répondant aux 3 questions, on a déjà une base... Mais ça ne suffit pas pour avoir une bonne note. Il faut rajouter du détail.
En général, il faut essayer de placer au moins un "include" ou un "extends" ! En effet, quand on fait un exercice (nous les salauds de profs), on cherche à utiliser le plus de choses vues en cours...
Donc pour placer ces liens particuliers, il faut essayer de répondre aux questions suivantes :
Avec tous ces éléments, faites le diagramme de cas d'utilisation de l'exemple donné plus haut.
Solution (cliquez-moi...)
Les diagrammes de classes font parti des diagrammes les plus importants. En effet, dans votre vie de programmeurs, vous aurez souvent besoin de les utiliser (mais aussi de les créer).
Les diagrammes de classe expriment la structure statique du système en termes de classes et de relations entre ces classes.
Rappel : Une classe est un type abstrait caractérisé par des propriétés (attributs et méthodes) communes à un ensemble d'objets et permettant de créer des objets ayant ces propriétés.
Dans un diagramme de classe, ne pas représenter les attributs ou les méthodes d'une classe n'indique pas que cette classe n'en contient pas. Il s'agit juste d'un filtre visuel, destiné à donner un certain niveau d'abstraction à son modèle. C'est notamment utile lorsque l'on a beaucoup de classes, et que l'on veuille toutes les représenter.
De même, ne pas spécifier les niveaux d’accès des membres d'une classe ne veut pas dire qu'on ne représente que les membres publics
Pour un modèle complexe, plusieurs diagrammes de classes complémentaires doivent être construits.
On peut par exemple se focaliser sur :
Lorsque l'on a fini de faire un diagramme de classe, on souhaite bien souvent le traduire en C++. C'est une étape cruciale et très facile, à condition de respecter un certain nombre de règles...
Détaillons un peu tout ça :
Comment transformer la classe Conducteur en C++?
Tout d'abord, occupons nous de la visibilité. "+" veut dire public, "-" veut dire private et "#" veut dire protected.
Ensuite, par soucis de lisibilité, écrire le code C++ qui correspond aux les attributs avant les méthodes (ça marche dans le désordre, mais pour s'y retrouver après...).
Enfin, faites attention à renverser l'ordre des types (en UML, c'est le nom puis le type, en C++ c'est l'inverse).
L'un des avantages des diagrammes de classe se trouve dans la possibilité de représenter les liens entre les classes. Mais quand on doit passer à du code (C++ ou Java), on a bien souvent bien du mal à savoir comment transformer ces liens. De plus, il n'y a pas de règle absolue, la norme UML n'explique pas comment les transformer. Cependant, avec un peu de logique, on peut s'en sortir ;-)
Donc comment transformer un lien "simple". (par lien "simple", je veux dire tout ce qui n'est pas héritage, ni agrégation, ni... Un lien "simple" quoi ;-).
Pour bien comprendre, reprenons le diagramme donné un peu plus haut. Comment implémenter le fait qu'un conducteur peut conduire 0 ou plusieurs voitures ?
Attention : ne pas se mélanger les pinceaux !
J'en vois 2-3 au fond de la classe qui se préparent à me dire "Comment ça plusieurs voitures? Il peut en conduire plusieurs en même temps ???".
La question du "en même temps" ne se pose pas : un diagramme de classe, c'est statique et donc le temps n'existe pas.
Intuitivement, on va se dire (ou pas ;-) : "0 ou plusieurs, avec ça, on va se faire un tableau de Voiture!".
Et on aurait presque raison. Le problème avec les tableaux, c'est qu'il y a un nombre de cases max connu dès le début. Et notre * est là pour nous mettre des bâtons dans les tableaux. Règle : les tableaux ne peuvent pas servir quand on a une étoile en cardinalité.
"Bon... On pourrait utiliser un pointeur vers la classe Voiture ?". Encore raté. Le pointeur ne montre pas assez qu'il y a potentiellement plusieurs Voitures... Cependant, on se rapproche de la solution.
La solution que je trouve la plus juste revient à utiliser les vecteurs en C++. Un petit effort de mémoire pour vous souvenir des classes vector...
L'avantage de cette classe est qu'elle permet d'ajouter, d'enlever ou de modifier des cases à la volé. Donc l'esprit du "0 ou plusieurs" est conservé !
On aurait pu aussi faire une liste chainée de Voiture, mais ça alourdirait le code... Autant se servir de la classe vector qui est en réalité une liste chainée améliorée !
Appliquez ces concepts sur les deux classes Conducteur et Voiture...
Solution (cliquez-moi...)
Si on a bien compris ce que c'est qu'une agrégation et une composition, ça ne devrait pas poser de problème.
Le seul truc à bien comprendre, c'est que dans le cas d'une agrégation, la vie des objets est indépendante, tandis qu'avec une composition, c'est lié.
Donc, on peut dire que le truc qu'apporte en plus ces deux types de liens, c'est de l'information sur la durée de vie...
La durée de vie d'un objet, c'est savoir quand un objet est créé et quand il est détruit. Donc rappels :
Donc, à la lumière de ces informations, déduire ce qu'il faut rajouter pour faire figurer ces infos dans le code C++.
Solution (cliquez-moi...)