À présent, vous connaissez les bases de la modélisation UML : comment représenter des classes et les associer.
Je vous propose maintenant de perfectionner votre modélisation.
Généralisez et spécialisez vos classes
Jusqu’à maintenant, j’ai parlé de films de manière générale. Mais vos données sont un peu plus précises que cela. En effet, ce que j’ai appelé « film » peut en réalité être un long-métrage, un téléfilm ou une série (diffusée sur le web ou à la télévision). Pour être plus correct, je vais maintenant employer le terme « Oeuvre » au lieu de « Film ». Une œuvre sera donc soit un long-métrage, soit un téléfilm, ou une série.
Jusqu’à maintenant, le type de l'œuvre est enregistré dans l’attribut typeDeTournage
.
J’ai vu dans le fichier CSV que dans le cas des séries, on connaît parfois le numéro de saison. Peut-on ajouter un attribut saison
dans la classe Oeuvre
?
C’est une bonne idée ;) .
Cependant, cet attribut ne sera utilisé que si l'œuvre est une série. Il restera vide si l'œuvre est un téléfilm ou un long-métrage. Cette solution n’est donc pas optimale. L’idéal serait de placer cet attribut dans une classe Serie
.
Heureusement, c’est possible ! On fait cela via la notion d’héritage, comme ceci :
La relation d’héritage se représente par une flèche triangulaire blanche (vide). Elle indique que la classeOeuvre
(appelée classe mère) est plus générale que ses classes filles, qui sont plus spécialisées.
Ainsi, toutes les classes filles (Telefilm
,Serie
etLongMetrage
) héritent deOeuvre
, et cette dernière transmet automatiquement à ses filles ses attributs et ses méthodes. De cette manière, toutes les classes filles possèdent l’attributTitre
. La classeSerie
a quant à elle deux attributs :Titre
etSaison
.
Soyons fous : on peut aussi enchaîner les relations d’héritage, en créant les classesSerieTV
et SerieWeb
! Voici le résultat :
Restreignez l’instanciation des classes grâce aux classes abstraites
Lorsque l’on utilise l’héritage, il est parfois utile de spécifier qu’une classe est abstraite, c’est-à-dire qu’elle ne peut pas être instanciée.
C’est votre cas : dans la BDD, vous voulez qu’une œuvre soit obligatoirement un téléfilm, une série TV, une série web ou un long-métrage. La notion d'œuvre est trop générale pour que vous l’acceptiez. En effet, considérer un téléfilm simplement comme une oeuvre, c’est perdre les informations spécifiques au téléfilm.
Par exemple, En Thérapie est une instance de
SerieTV
, mais pas deOeuvre
. De même, 120 Battements par minute est une instance deLongMetrage
. Bref, on veut qu’aucune œuvre soit enregistrée dans la BDD sans préciser si c’est un téléfilm, une série ou un long métrage.
Pour indiquer une classe abstraite, il suffit de mettre son titre en italique. Voici donc ce que cela donne si vous définissezOeuvre
etSerie
comme abstraites :
Découvrez d’autres possibilités offertes par l’UML
Je vous donne ici quelques autres possibilités qui concernent les associations entre les classes. Dans le cadre de ce cours, il n’est pas nécessaire de les détailler, mais sachez juste que ces possibilités existent. Je vous donnerai quelques liens utiles si vous souhaitez creuser le sujet. ;)
L’agrégation
L’agrégation s’utilise lorsqu’une classe est un ensemble ou un regroupement d'objets. Elle est très similaire à une association classique, et que vous l'utilisiez ou non, cela n’aura aucune implication lors de la traduction du MCD vers le MLD.
Elle se représente comme ceci, avec un losange blanc (vide) :
Contrairement à la composition, il n’y a pas de contrainte sur les multiplicités, ni sur le cycle de vie des objets agrégés (ils peuvent exister même lorsque l’objet agrégeant disparaît).
L’association ternaire
Il est possible de créer des associations entre plus que 2 classes. Ce sont les associations N-aires. Voici un exemple d’association ternaire :
En pratique, on n’utilise jamais d’association de degré supérieur à trois. De plus, les associations ternaires peuvent toujours être transformées en trois associations binaires, en transformant l’association en une nouvelle classe, comme ceci :
Les notes
Il est possible d’ajouter des notes au diagramme de classes. Elles servent à apporter tout type de précisions. Notamment les contraintes sur certains attributs.
Sur votre diagramme, vous auriez pu poser la contrainte que l’attributdateDeDebut
doit être une date antérieure àdateDeFin
. Eh oui, cela paraît logique, mais il faudra le spécifier à votre SGBDR car il ne le fera pas automatiquement !
Les notes servent aussi à préciser les domaines des attributs quand ceux-ci sont plus complexes queEntier
,Date
,Texte
, etc.
Par exemple : “Entier compris entre 1 000 et 2 000”.
Les doubles associations
Deux classes peuvent être liées entre elles via deux (ou plus) associations.
Ce serait le cas lorsqu’une personne écrit un livre, et lorsqu’une autre personne traduit ce livre dans une autre langue :
Les rôles de classes
Plutôt que de donner un nom aux associations, vous pouvez aussi caractériser une association par le rôle que tient chacune des deux classes. C’est le cas dans cet exemple, où on peut remplacer le nom de l’association « conduit » par « conducteur » et « moyen de locomotion » :
L’association réflexive
Une classe peut être associée à elle-même !
Par exemple, une classeCategorie
peut avoir des sous-catégories et des catégories parentes :
En résumé
Un lien de généralisation se modélise par l'héritage, qui permet de généraliser ou spécialiser un concept.
L’héritage s’utilise parfois avec des classes abstraites, qui sont des classes non instanciables.
Il existe d’autres types d’associations, comme l’agrégation et l’association ternaire.
On précise tout type de commentaire ou de contrainte grâce aux notes.
Deux classes peuvent être liées par plusieurs associations ayant toutes un nom ou un rôle différent. Une classe peut aussi être liée à elle-même par une association réflexive.
Voilà ! Le diagramme de classes UML n’a (presque) plus de secrets pour vous. Dans le chapitre suivant, vous allez poser votre crayon et apprendre à dessiner un diagramme de classes avec un vrai logiciel dédié à cela !