Escolar Documentos
Profissional Documentos
Cultura Documentos
Objectifs du chapitre
Ce chapitre va nous permettre d'illustrer les principales constructions du diagramme de classes UML durant l'tape d'analyse, Le diagramme de classes a toujours t le diagramme le plus important dans toutes les mthodes orientes objet. C'est galement celui qui contient !a plus grande gamme de notations et de variantes. UML a russi unifier le vocabulaire et les concepts sans perdre la richesse et les apports des diffrentes mthodes existantes.
Le dveloppement du modle statique constitue la deuxime activit de l'tape d'analyse. Elle se situe sur la branche gauche du cycle en Y et succde au dcoupage en catgories. Les diagrammes de classes tablis sommairement dans les DCP (diagrammes des classes participantes du chapitre 4), puis rorganiss lors du dcoupage en catgories (chapitre 6), vont tre dtaills, complts, et optimiss. Il s'agit d'une activit itrative, fortement couple avec la modlisation dynamique, dcrite au chapitre suivant. Pour les besoins du livre, nous avons prsent ces deux activits de faon squentielle, mais dans la ralit elles sont effectues quasiment en parallle.
134
UML en action
Classe, responsabilit, Association, multiplicit, agrgation, composition, Attribut, attribut driv, attribut de classe, Classe d'association, qualificatif, Opration, opration de classe,
Classification, gnralisation, spcialisation,
135
classes vagues : elles ne correspondent pas des concepts que l'on peut exprimer par des classes. Ainsi, des termes tels que organisation des rseaux ou configuration des tapes sont trop gnraux et ne sont pas suffisamment prcis pour justifier la cration d'une classe ; classes la place d'attribut : elles expriment des concepts quantifiables ; Exemple SIVEx : pas de classe Poids, ce n'est qu'un attribut de Colis. classes la place d'un rle : elles expriment un rle dans une association particulire ;
Exemple SIVEx : dans la catgorie Ressources, la notion d'agence principale est reprsente par un rle d'association entre les classes ZoneRedistribution et Agence, et non par une classe part entire. classes reprsentant des acteurs : souvent utiles, mais uniquement lorsque le systme gre des informations sur l'acteur ; Exemple SIVEx : dans la catgorie Ressources, on ne trouve pas la classe Rpartiteur, contrairement aux autres acteurs. En effet, elle semble inutile, alors qu'OperateurQuai est utilise dans Colis, Rceptionniste dans Commandes, et Chauffeur dans Missions. classes de conception : elles introduisent trop tt des choix de ralisation. Ainsi, le concept fichier client n'a pas de sens dans le mtier, bien qu'intgr au jargon des utilisateurs ; -- classes reprsentant des groupes d'objets : elles sont inutiles, car implicites dans les multiplicits des associations, et font souvent rfrence des choix de conception.
Exemple SIVEx : on ne trouve pas dans le modle d'analyse de classe ListeCommandes ou ListeColis. Ces groupes d'objets sont implicites dans les associations entre Mission et Commande, et entre Commande et Colis.
De la mme faon, on peut indiquer quelques principes afin d'optimiser le modle structurel. Cela conduit tantt ajouter des classes manquantes, tantt subdiviser une classe existante en plusieurs : une classe ne doit pas avoir trop de responsabilits, il en rsultera sinon un nombre lev d'associations, d'attributs ou d'oprations. 11 est donc prfrable de la dcouper en ensembles plus petits et homognes en termes de responsabilits et de cycles de vie ; ne pas confondre objet physique et objet logique : autrement dit une entit et sa description. Ces deux principes sont illustrs dans l'tude de cas ci-aprs.
136
UML en action
est rattach
137
En revanche, ces responsabilits ne prjugent pas de la structure des classes en conception. C'est en effet durant l'tape de conception dtaille (voir chapitre 11), qu'on effectue les choix d'implmentation du modle structurel, avec des objectifs d'optimisation et de modularit. Voici deux principes gnraux qui permettent d'liminer les associations incorrectes ou inutiles : associations non structurelles : elles expriment des relations dynamiques, c'est--dire des liens instantans entre objets. Les liens structurels se caractrisent par une certaine dure et une certaine stabilit ; associations redondantes ; elles peuvent tre retrouves par navigation grce aux associations existantes.
Un EnCoursDeCmd concerne une Commande, une Commande concerne un Client II serait inutile d'ajouter une association entre EnCoursDeCmd et Client pour prciser qu'un EnCoursDeCmd concerne un et un seul Client. En effet, implicitement, un parcours enchanant plusieurs associations combine les multiplicits successives, en multipliant respectivement entre elles les bornes minimales et les bornes maximales. En voici un exemple :
de EnCoursDeCmd Client en passant par Commande, la multiplicit s'obtient par : ( 1 . . 1 ) x
(1..1) = 1..1;
dans l'autre sens, de Client EnCoursDeCmd en passant par Commande, la multiplicit s'obtient par . (0..*)x(0..1) = 0..*. L'association concerne est donc totalement redondante avec les deux autres associations et
138
o
UML en action
De mme, la smantique des classes associes et de l'association elle-mme peut subtilement influencer les multiplicits. Une illustration en est donne par les trois exemples suivants, tous corrects1, mais ayant des significations diffrentes.
Un Mari est forcment mari une et une seule pouse, dans le contexte de la loi franaise actuelle. En revanche, si les concepts plus gnraux d'Homme et de Femme nous intressent indpendamment des liens du mariage, l'association ; devient optionnelle ; Mari et Epouse deviennent alors des rles. Vous remarquerez au passage combien la diffrence entre classe et rle est tnue, dans la mesure o elle dpend fortement du contexte du problme. Si enfin, on veut conserver l'historique des liens de mariage, la multiplicit devient non borne.
I .Attention, prcisons que ces diagrammes sont corrects dans le conteste de la loi franaise en ce dbut d'anne 2004 ! Ils excluent en effet la polygamie ainsi que le mariage homosexuel...
139
Affiner les associations consiste galement utiliser deux notions complmentaires fournies par UML ; l'agrgation et la composition. Une association entre deux classes reprsente par dfaut une relation structurelle symtrique entre entits de mme importance. Mais UML fournit deux notions qui permettent d'affiner la dfinition conceptuelle d'une association. Il s'agit de l'agrgation et de la composition qui ajoutent l'association le sens d'une relation d'lments ensemble. Si l'une des classes joue le rle d'ensemble compos d'instances de l'autre classe, utilisez l'agrgation. Une agrgation n'est plus smantiquement symtrique, puisqu'elle privilgie l'une des deux classes en l'levant au rang de conteneur. L'agrgation garde cependant les proprits d'une association et n'influe ni sur l'expression des multiplicits, ni sur la navigabilit, ni sur le cycle de vie des instances relies. Par consquent, il est possible de partager l'agrgation : une partie peut appartenir simultanment plusieurs agrgats. La composition est en revanche une variante d'agrgation qui influe sur la structure des instances qu'elle relie. Avec une composition, nous introduisons
ainsi les deux caractristiques suivantes :
la composition n'est pas partageable : un objet ne peut appartenir qu' un seul composite la fois ; le cycle de vie des parties est fortement li celui du composite : la destruction du composite entrane en particulier la destruction de ses parties.
140
UML en action
Dans cet exemple, toutes les associations ont la smantique de l'agrgation. Mais vrifient-elles en plus les critres de la composition ? Le premier critre (non partageable) est bien vrifi par toutes les agrgations sauf celle entre ZoneRedistribution et Agence. En revanche, seule l'agrgation entre Agence et Quai correspond au critre d'imbrication du cycle de vie entre composite et composants. Par exemple, la suppression d'une Agence n'entrane pas celle de ses vhicules et chauffeurs, qui vont tre raffects une autre agence. Si l'on reprend l'exemple de la figure 7-2, on peut galement distinguer une composition et une agrgation, en fonction du critre qui consiste lier les cycles de vie des parties leur ensemble : la suppression d'une commande implique celle de ses descriptions de colis.
Agrgation
Affiner les associations, c'est aussi identifier leurs rgles de gestion. UML propose un certain nombre de proprits standard applicables aux associations: on peut spcifier que les objets une extrmit de l'association doivent tre ordonns avec la proprit { ordered} ; on peut galement prciser qu'un lien ne peut plus tre modifi ni dtruit avec la proprit { frozen} . Dans le mme esprit, la proprit { addOnly} signifie que de nouveaux liens peuvent tre ajouts depuis un objet de l'autre ct de l'association, mais non supprims'. Il est noter que la proprit { ordered} n'induit pas la faon dont les objets vont tre ordonns : numro, ordre alphabtique, etc. Il s'agit en gnral d'un choix de conception.
1.Mme si les contraintes prdfinies ! frozen} et {addOnly} semblent avoir disparu du standard UML 2.0, nous continuerons les utiliser pour leur valeur ajoute.
141
{ordered)
0.1
Figure 7-9.. Autres proprits des associations de la catgorie Missions Dans la catgorie Comptabilit, une rflexion plus pousse sur les multiplicits, les proprits et la navigabilit permet d'liminer une association redondante et supprime de (a sorte la dpendance
142
UML en action
tienne lieu
' -{orOerea, addOnly}
une Commande a une rfrence, un cot estim et un type de service ; un Colis a un poids.
e
tude
En analyse, un concept est une entit utilise par l'expert du domaine dans le ; cadre de son mtier ou de l'application. Tout concept doit tre modlis par ; une classe car il est implicitement porteur de proprits, assume des responsabilits fonctionnelles dans le systme et parcourt ventuellement des tats diffrents. L'attribut n'est qu'une des proprits d'une classe se caractrisant par une quantit mesurable, comme le poids du Colis, ou la possibilit d'tre valoris par une ou plusieurs donnes, par exemple le nom d'un Client.
143
I Notez encore qu'un attribut peut tre valoris par une structure de donnes ou bien qu'il peut tre multiple au sein d'une classe. Contrairement ce que twfe nous rencontrons souvent dans les projets, ces caractristiques ne transforment pas pour autant un attribut en classe. Dans l'exemple ci-dessous, l'analyste comprend qu'un Point n'est pas manipul par l'utilisateur et que l'on : peut valoriser un Point par la donne de deux coordonnes dans son modle. II transforme donc la classe Point en attribut mulliple dans les diffrentes classes gomtriques. Remarquez comment le diagramme s'en trouve allg.
Figure 7-11. : Attribut ou classe ? Nous allons illustrer la diffrence entre attribut et classe sur l'tude de cas, ainsi que trois erreurs frquentes de modlisation lies au concept d'attribut.
figure 7-12. : Exemple d'attribut abusif Un autre dfaut frquent consiste dcrire correctement l'association entre les deux classes, mais ajouter tout de mme un attribut redondant dans l'une des classes Par exemple, la classe Commande n'a pas besoin d'un attribut nomClient, puisque chaque Commande concerne un Client qui a dj un nom
144
Attribut redondant
UML en action
La diffrence subtile entre les concepts d'attribut et de classe se retrouve galement dans la notion de rle d'une extrmit d'association.
lude
145
Revenons sur les deux faons possibles de nommer les associations. La premire consiste utiliser un groupe verbal, afin que l'association puisse tre lue comme une phrase. C'est ainsi que procdaient les mthodes traditionnelles de modlisation de donnes. Cette mthode prsente un inconvnient : le sens de lecture du verbe n'est pas forcment le sens naturel (de gauche droite ou de haut en bas) aprs plusieurs remaniements de diagramme. Cependant, en analyse, c'est souvent la technique la plus simple mettre en uvre. La deuxime consiste nommer le rle que joue chacune des classes dans son association avec l'autre. Ce rle reprsente une sorte d'attribut complexe de la classe distante, il est donc dcrit par un substantif. L'inconvnient de la mthode prcdente est ainsi rsolu, puisque les noms de rles restent bien accrochs leur extrmit d'association, mme si on les dplace graphiquement. De plus, le substantif a de grandes chances d'tre utilis lors de la gnration de code (voir le chapitre 11 sur la conception dtaille).
Figure 7-16. : Exemples de rles d'association II est noter que les noms de rles sont obligatoires pour les associations qui ' bouclent sur une classe, comme celle de la classe Site sur la figure prcdente Toutefois, il faut rester pragmatique : ne nommez les associations que si le nom apporte une information significative pour le lecteur. Inutile de prciser est reli , est associ ou de recopier le nom de la classe comme nom de rle ! Certaines associations sont videntes ; par ailleurs n'oubliez pas que l'agrgation et la composition signifient dj quelque chose par elles-mmes.
DISTINGUEZ LES ATTRIBUTS DRIVES !
Conseil
Un attribut driv est un attribut intressant pour l'analyste, mais redondant, car sa valeur peut tre dduite d'autres informations disponibles pour la classe concerne. UML permet la fois de le citer en tant qu'attribut, d'indiquer au lecteur du modle son caractre redondant grce au / et enfin d'exprimer la contrainte associe.
146
UML en action
Le cas le plus simple esl celui d un attribut driv d'un autre attribut de la mme classe. Par exemple, l'ge d'un Chauffeur est driv de sa date de naissance.
En analyse, un attribut driv indique seulement une contrainte entre deux proprits, un invariant, comme le montre l'exemple prcdent. Il ne prcise pas encore ce qui doit tre calcul par rapport ce qui doit tre stock : ce sera un choix de conception. Un attribut driv peut aussi tre dduit de faon plus complexe. Par exemple, le poids estim d'une Commande est gal la somme des poids estims de ses descriptions de colis.
Contraints
Conseil
Par dfaut, un attribut a une porte d'instance : chaque objet de la classe possde sa propre valeur pour la proprit. Dans certains cas plus rares, l'attribut peut avoir une porte de classe : il existe alors une seule valeur commune de la proprit pour toutes les instances de la classe. On parle dans ce cas d'attribut de classe1, et on le souligne pour le distinguer des attributs d'instance.
l.La plupart des outils de modlisation proposent plutt une case cocher static . d'aprs le mot-cl correspondant en Java. C++ ou C#
147
Les factures sont transmises en fin de journe au module CO de SAP : la classe TransmissionComptable comporte deux attributs principaux une date et une heure de transmission effective. On souhaite suivre les carts de transmission relle par rapport a l'heure planifie, soit 22 h tous les soirs. Il suffit pour cela d'ajouter un attribut de classe heurePlanifiee, dont la valeur est identique pour tous les objets de la classe, et un attribut driv cart.
0
Ne pas faire
Dans les diagrammes prcdents, nous avons simplement indiqu le nom des attributs. C'est gnralement suffisant pour le lecteur d'un modle d'analyse. Il sait parfaitement ce qu'est une date, unpoidsEstime, ou un coutEstime. La syntaxe complte d'un attribut en UML est videmment plus complexe :
[ visibilit] nom [ multiplicit] [{proprit}] [: type] [ = val_init]
Les dclarations optionnelles (entre [ ] ) sont utiles en conception ; certaines sont mme ncessaires. En revanche, en analyse, nous vous conseillons de ne les employer qu'avec parcimonie, le risque tant de faire prmaturment des choix de conception injustifis. En analyse, il faut rarement anticiper le type, la valeur initiale, ou la visibilit. Les seules dclarations intressantes sont les suivantes : la multiplicit permet de simplifier certains diagrammes, en exprimant de faon condense des structures de donnes, comme nous l'avons vu la figure 7-11; la valeur initiale est surtout utile pour les attributs de classe (comme dans l'exemple de la TransmissionComptable : heurePlanifiee = 22h) ;
148
UML en action
la proprit { f rozen} permet d'indiquer un attribut dont la valeur ne peut plus changer une fois que l'objet a t cr. Ne pas faire La proprit permet d'indiquer un attribut dont la valeur ne peut pas tre modifie par les objets clients.
Nous venons de voir comment affiner les classes, affiner les associations et ajouter les attributs. 11 arrive que l'on ait besoin d'effectuer les trois activits la fois : ajouter une classe pour dcrire des attributs ports par une association. En effet, une association entre deux classes peut elle-mme comporter des attributs. L'exemple type est celui de la relation employeur/employ entre Socit ei Personne. O placer les proprits de salaire, anciennet, etc.. si les multiplicits sont 0..* des deux cts de l'association ? Il faut valoriser ces attributs pour chaque couple d'instances (SocitPersonne), et pas simplement pour un objet. La solution en UML consiste modliser cette association comme une classe Emploi qui contient les proprits de l'association. Il existe alors une instance d'Emploi pour chaque lien entre objets des deux classes. La classe Emploi esl appele classe d'association ; il s'agit d'un lment de modlisation UML qui est la fois une classe et une association. Elle peut donc son tour tablir des relations avec d'autres classes, comme Emploi avec ConventionCollective.
149
La figure suivante prsente une instanciation possible du diagramme prcdent, dans lequel les objets El et E2 portent des valeurs diffrentes pour certains attributs. Nous ne les avons pas indiqus pour des raisons videntes de confidentialit :-).
Dans la catgorie Reseau, chaque Parcours dcrit en ralit une relation entre deux Sites (il en va de mme pour les Connexions entre Agences). Le modle se trouve amlior si l'on transforme Parcours et Connexion en classes d'associations.
Notez que l'existence d'un objet Parcours est obligatoirement subordonne au lien entre deux objets Site. Cette relation de dominance entre Site et Parcours est plus clairement exprime par la deuxime solution celle o Parcours devient une classe d'association.
150
UML en action
Une association ne peut comprendre des proprits qu'en se transformant en classe d'association. En consquence, le nom de la classe d'association est galement celui de l'association. Vous pouvez nanmoins nommer galement les rles ports par les extrmits de cne association, comme la figure 7-23. Il peut arriver que vous vouliez dcrire les mmes proprits pour plusieurs associations. Dans ce cas, vous ne pouvez pas rutiliser une classe d'association en l'attachant d'autres associations, puisqu'elle est l'association elle-mme. Une solution peut consister dfinir une super-classe (gnralement abstraite) dont hriteront les diffrentes classes d'association, comme illustr la figure ci-aprs.
Parfois, un ou plusieurs attributs initialement affects une classe ne servent qu' prciser la dsignation d'objets par le biais d'une association.
QU'EST-CE QU'UN QUALIFICATIF ?
Un qualificatif est un attribut d'association dont les valeurs partitionnent la liste des objets relis par le biais d'une association. En d'autres termes, la connaissance d'un objet et d'une valeur de qualificatif permet de retrouver un ou plusieurs objets lis l'autre bout de l'association concerne. Le qualificatif affine donc l'accs une instance par navigation sur une association. Il ne s'applique videmment qu' une multiplicit suprieure 1 puisqu'on ne peut partitionner une liste compose d'un seul lment.
I .Ou qualifieur ? Il s'agit en effet d'une traduction du terme anglais qualifier ...
La dfinition du qualificatif n'est pas aise saisir sans exemple, nous en dveloppons ci-aprs diffrentes utilisations. Reprenons par exemple la relation employ-employeur de la figure 7-21. O placer l'attribut matricule ? premire vue, il s'agit d'une proprit de la classe Personne. Mais en fait, une personne possde un matricule pour chacun
151
de ses employeurs. Il s'agit donc plutt d'un attribut de l'association, que nous pouvons placer dans la classe Emploi. Poussons l'analyse encore un peu plus loin : quoi sert l'attribut matricule sinon rfrencer un employ au sein de son employeur? Il s'agit d'un identifiant relatif, dont la valeur permet d'accder une instance particulire de Personne, pour une Socit donne. C'est exactement la notion de qualificatif en UML. Il se reprsente graphiquement comme indiqu la figure ci-aprs, qui rcapitule les tapes de la transformation d'un attribut en attribut d'association, puis en qualificatif, avec la rduction de multiplicit qui s'ensuit.
Un objet Socit dot d'une valeur particulire du qualificatif matricule a accs un objet Personne au plus, car la multiplicit a t rduite 0..1 , II peut y avoir des numros de matricule inutiliss, d'o la limite infrieure 0.
Une Agence contient des Quais et chaque Quai y est rfrenc par un numro. Ce numro reprsente un identifiant relatif une Agence particulire, et non un identifiant absolu du Quai. Dans un sens, numro n'est pas seulement un attribut de l'association. puisqu'il permet d'identifier de faon unique un Quai 'par rapport une Agence.
192
UML en action
Notez bien la modification de la multiplicit de l'autre cot du qualificatif. Pour une instance d'Agence el une valeur de numro, il existe au plus un Quai. Autrement dit. dans une agence donne, deux quais ne peuvent porter le mme numro. Attention cependant car mme si c'es! te cas le plus frquent, un qualificatif ne rduit pas systmatiquement ia multiplicit de 0..* -1 (ou - 0..1 ) Supposons que chaque Agence possde plusieurs parcs de vhicules Si l'on utilise le numro de parc comme qualificatif, la multiplicit du ct de la classe Vhicule reste 0..* -.
153
Soyez toutefois vigilants dans la mesure o toutes les oprations identifies de cette faon ne sont pas pertinentes. Certains verbes ne traduisent pas des oprations mtier, mais plutt des traitements de l'IHM comme les oprations saisir et diter de l'exemple prcdent, qui ne seront pas conserves. D'autres verbes reprsentent des oprations implicites en analyse, qui ne seront donc pas indiques sur le diagramme de classes. Au prochain chapitre, nous verrons que la meilleure faon d'identifier les oprations consiste tudier la dynamique de l'application : les interactions entre les objets et les tats des classes en fournissent la matire premire.
NE REPERTORIEZ PAS LES OPERATIONS IMPLICITES EN ANALYSE !
Ht pas fort
Pour ne pas surcharger les diagrammes de classes, il est inutile de recenser certaines oprations implicites pour toutes les classes, comme : ta cration et la destruction d'instances : constructeur et destructeur en programmation objet ; la manipulation des attributs, savoir lecture et modification : accesseurs en programmation objet ; la cration et la destruction de liens, implicites d'aprs les associations, avec leurs multiplicits et leurs proprits ventuelles ; les parcours et les recherches sur les associations. Notez que cette recommandation s'applique souvent tout aussi bien en conception, puisque la plupart des outils UML du march sont capables d'ajouter automatiquement les oprations cites prcdemment. De mme, les oprations non mtier lies en particulier l'IHM ou au stockage physique seront ajoutes ultrieurement. Il n'est donc pas tonnant qu'une classe d'analyse ait rarement plus de quatre ou cinq oprations. Toutes les autres oprations, implicites ou non mtier, viendront s'ajouter en conception'.
! N'UTILISEZ PAS LA NOTATION COMPLETE <0 ^
Ne pal fort
Comme pour les attributs, le nom des oprations est suffisant pour le lecteur d'un modle d'analyse. Il comprend ce que signifient envoyer, bloquer, valider. Au mieux, il se rfrera au modle dynamique pour saisir le contexte : dans lequel l'opration est effectue (voir chapitre 8).
I .Depuis plusieurs annes, la tendance consiste reporter l'identification des oprations dans les classes l'tape de conception. De nombreux auteurs recommandent soit de ne lister en analyse que des responsabilits (et pas de figer l'interface de la classe) soit carrment de ne pas du tout s'occuper des oprations ! Voil la raison pour laquelle nous avons indiqu en dbut de chapitre que l'ajout des oprations dans le modle d'analyse est optionnel.
154
UML en action
Mais il est clair qu'en analyse, le nom de l'opration et un commentaire textuel suffisent. Toutes les autres informations ne seront utiles qu'en conception. Comme pour les attributs, une opration a une porte d'instance par dfaut : elle s'applique un objet de la classe. Certaines oprations ont une porte de classe, on parle alors d'opration de classe. Les deux exemples les plus courants d'oprations de classe sont : les oprations qui permettent de crer de nouvelles instances ; les oprations qui manipulent les attributs de classe. Or, d'aprs ce que nous avons dit prcdemment, ces types d'oprations sont implicites en analyse. On peut donc en conclure que les oprations de classe sont trs rarement utiles en phase d'analyse, en tout cas nettement moins que les attributs de classe.
ETUDE DE CAS : OPERATIONS DES CLASSES DE LA CATGORIE CLIENTS
155
Reprenons l'exemple du suivi de mission (figure 7-8). Si nous ajoutons les attributs et les oprations et que nous extrayons la classe Su/vMission de la classe Mission existante (pour bien sparer les responsabilits), nous obtenons le diagramme suivant :
II est clair que nous pouvons simplifier ce schma en considrant IncidentMission comme une sous-classe d'EvenementMission. En effet, toutes les proprits d'EvenementMission se retrouvent dans IncidentMission, et smantiquement un IncidentMission est bien une sorte d'EvenementMission. On obtient alors :
156
UML en action
On peut mme affiner plus avant en distinguant deux types d'incidents : les incidents de trajet (panne du vhicule, etc.) et les incidents d'tape (client absent, livraison refuse, etc.).
Figure 7-32. : Arbre de gnralisation d'EvenementMission Dans le diagramme prcdent, vous remarquez que la classe IncidentMission est en italique. En UML, cela signifie que cette classe est abstraite, c'est--dire qu'on ne peut pas l'instancier directement. Autrement dit, pour instancier la super-classe abstraite IncidentMission. il faut obligatoirement instancier une de ses sous-classes, qui sont pour leur part concrtes. Une super-classe n'est pas forcment abstraite Ainsi, la classe EvenementMission ne l'est pas, car il peut en exister des instances directes Sa sous-classe IncidentMission est en revanche abstraite, ce qui montre que la super-classe d'une classe abstraite peut tre concrte ! Nous avons dit qu'IncidentMission peut tre considre comme une sous-classe d'Evenemeni-Mission, puisque toutes les proprits d'EvenementMission valent galement pour IncidentMission, et qu'elle a des proprits spcifiques supplmentaires Une autre faon de l'exprimer consiste utiliser le principe de substitution de Liskov Partout o nous parlons d'EvenementMission (la super-classe). nous devons pouvoir lui substituer n'importe laquelle de ses sous-classes, sans que cela cause le moindre problme. Si nous crivons la phrase : - Un EvenementMisson concerne une et une seule Mission, il est dat et peut tre archiv -, nous pouvons remplacer EvenementMission par IncidentMission, IncidentTraiet, ou IncidentEtape, et la phrase doit rester vraie.
On s'aperoit parfois, aprs avoir ajout les attributs et les oprations, que certaines sous-classes ont t distingues tort. En effet, elles ont les mmes proprits et les mmes comportements et peuvent tre facilement fusionnes.
Ne pas fort
157
Prenons les diffrentes sous-classes d'Utilisateur, que nous retrouvons dans plusieurs catgories. Si Chauffeur et Client ont bien des attributs et des associations propres, on peut se passer de Rceptionniste et OperateurQuai. C'est le cas galement pour tes sous-classes MissknEnlevement et MissionLivraison. qui ne prsentent aucune diffrence fondamentale il est donc souhaitable de les fusionner en une seule classe AfesnDe Tourne, en ajoutant simplement un attnbut nature pour pouvoir les distinguer. Nous conservons en revanche l'autre sous-classe MtssionTraction, car elle possde une association supplmentaire (avec Agence), ainsi que des rgles de gestion diffrentes
Figure 7-33. : Simplification de l'arbre de gnralisation de Mission Notez que la classe Mission est maintenant considre comme une classe abstraite. Pour la catgorie Ressources, nous avons spar le modle statique sur deux diagrammes de classes : un diagramme gnral sur les agences. puis le dtail concernant les vhicules et les chauffeurs. Nous n'avons pas encore envisag le fait qu'une ressource d'une agence peut tre provisoirement mise disposition d'une autre agence. Il en rsulte des associations supplmentaires par-
158
UML en action
tant d'Agence, et arrivant Vhicule et Chauffeur Pour factoriser toutes ces associations identiques, nous avons introduit une super-classe abstraite Ressource. Notez galement la classe d'association MiseADisposition Les dates de mise disposition des ressources d'une agence une autre sont typiquement valorises pour chaque couple (Agence, Ressource).
La figure suivante prsente le dtail concernant les chauffeurs et les vhicules. On peut remarquer l'hritage multiple de la classe Chauffeur. En effet, tout chauffeur est un Utilisateur, mais aussi une Ressource Ds lors que le principe de substitution est respect, il n'y a pas de raison d'interdire la gnralisation multiple en analyse.
159
R3
Si l'on regarde plus attentivement, on s'aperoit que les responsabilits R2 et R4 ne dpendent pas de chaque instance de Vhicule. En effet, les capacits d'un vhicule dpendent exclusivement de son type De mme, un chauffeur est qualifi pour un type de vhicule, et non pour un vhicule particulier. La bonne solution de modlisation consiste isoler cette notion de type de
160
UML en action
celle de vhicule, afin de mieux rpartir les responsabilits cet effet, nous allons crer une nouvelle classe, appele TypeVehicule, et modifier la rpartition des attributs et associations de la faon suivante :
Vous pouvez noter que cette manire de procder est rutilisable quel que soit le contexte1. On identifie une classe XX qui possde de nombreuses responsabilits. Certaines ne sont pas propres chaque instance. On ajoute alors la classe TypeXX ou ModeleXX et on rpartit les attributs et associations sur les deux classes. On termine en reliant XX et TypeXX par une association * -1 , souvent unidirectionnelle vers TypeXX. La classe TypeXX est qualifie de mtaclasse, car elle contient des informations qui dcrivent la classe-XX".
161
On nomme classiquement dlgation la technique consistant pour un objet dlguer une partie de ses responsabilits un autre objet li. Dernier avantage de cette solution : elle permet de lier de nombreuses instances de XX la mme instance de TypeXX, au lieu de rpter les valeurs communes des attributs att3 et att 4.
Conseil
Nous avons prcdemment voqu des proprits prdfinies en UML concernant les attributs et les associations. Il est parfois utile d'exprimer des Contraintes plus sophistiques entre plusieurs lments de modlisation. C'est le cas pour les attributs drivs : cela peut galement concerner les associations. On peut ainsi indiquer des contraintes d'inclusion ou d'exclusion entre associations, des contraintes de navigation ou des contraintes de drivation. i Attention cependant : on peut, si on abuse des contraintes, tre tent de combler des lacunes de modlisation par ce biais.
pona pale
Figure 7-39. : Exemple de contrainte d'inclusion entre associations Nous avons dj signale un certain nombre de contraintes sur les attributs, telles que celles qui expriment la drivation des attributs drivs, comme indiqu aux figures 7-17.7-18, et 7-19. Le schma suivant traduit un autre exemple de contrainte entre attributs
162
UML en action
Figure 7-40. : Exemple de contrainte entre attributs Remarquez la notation pointe qui est utilise dans la contrainte de la ligure prcdente. En fait, elle fait partie d'une syntaxe plus tendue appele OCL et propose par UML. Le langage OCL (Object Constraint Language) fait en eftet partie prenante d'UML et permet d'exprimer des contraintes sous forme d'expressions boolennes qui doivent tre vrifies par le modle Mais son utilisation n'est absolument pas impose, et suivant l'objectif du modle, vous pouvez exprimer vos contraintes en texte libre, ou plus formellement en CL OCL est un langage expressions, sans effet de bord sur le systme modlis. Sans entrer dans les dtails, l'exemple suivant montre l'utilisation du langage OCL La contrainte que nous voulons exprimer formellement est la suivante. un colis est dans l'tat nominal s'il n'a pas donn lieu la moindre anomalie.
OCL dfinit plusieurs types de collections d'objets, ainsi que de nombreuses oprations de manipulation de ces collections. Set est un ensemble au sens mathmatique. L'expression self..anomalieColis retourne l'ensemble des objets AnomalieColis lis l'objet colis concern. L'opration prdfinie size permet de tester si l'ensemble est vide. Pour une prsentation approfondie d'OCL. le lecteur se reportera [Warmer 99].
Le dveloppement du modle statique constitue la deuxime tape de la phase d'analyse. Les diagrammes de classes prliminaires obtenus lors du dcoupage en catgories sont dtaills, complts et optimiss.
163
II faut d'abord valider les classes et les associations candidates. Ce travail d'affinement est itratif: il ne faut pas hsiter modifier, ajouter ou mme Supprimer des classes et des associations, en se fondant sur la dfinition de leurs responsabilits. Sur les associations retenues, on prcise les multiplicits, les proprits, les contraintes, et l'on distingue les agrgations et les compositions. On ajoute ensuite les attributs, en distinguant les attributs drivs et les attributs de classe. Cela conduit frquemment identifier des classes d'association, et des qualificatifs. Une premire recherche d'oprations peut alors tre effectue ; elle sera complte lors de l'analyse dynamique. On optimise ensuite les diagrammes de classes en introduisanl des super-classes par gnralisation, tout en respectant le principe de substitution. La dmarche mise en uvre dans ce chapitre est synthtise par la figure suivante :
Diagrammes de classes optimiss
Cahier dts