Professional Documents
Culture Documents
Vosoffresd'emploiinformatique UIT
T
Dveloppeurs,chefsdeprojets,ingnieurs,informaticiens GRA
Postezgratuitementvosoffresd'emploiicivisiblespar4000000devisiteursuniquesparmois
emploi.developpez.com
Accueil ALM Java .NET Dv.Web EDI Programmation SGBD Office Solutionsd'entreprise
UML2
Del'apprentissagelapratique
Tabledesmatires
4.Chapitre4Langagedecontraintesobjet(Object
ConstraintLangage:OCL)
41.ExpressiondescontraintesenUML
411.Introduction
NousavonsdjvucommentexprimercertainesformesdecontraintesavecUML:
Contraintesstructurelles:
lesattributsdanslesclasses,lesdiffrentstypesderelationsentreclasses
(gnralisation,association,agrgation,composition,dpendance),lacardinalitetla
navigabilitdespropritsstructurelles,etc.
Contraintesdetype:
typagedesproprits,etc.
Contraintesdiverses:
lescontraintesdevisibilit,lesmthodesetclassesabstraites(contrainteabstract),etc.
Danslapratique,toutescescontraintessonttrsutiles,maisservlentinsuffisantes.
Toutefois,UMLpermetdespcifierexplicitementdescontraintesparticuliressurdeslments
demodle.
412.crituredescontraintes
Unecontrainteconstitueuneconditionouunerestrictionsmantiqueexprimesousforme
d'instructiondansunlangagetextuelquipeuttrenaturelouformel.Engnral,unecontrainte
peuttreattachen'importequellmentdemodleoulisted'lmentsdemodle.Une
contraintedsigneunerestrictionquidoittreappliqueparuneimplmentationcorrectedu
systme.
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 1/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Onreprsenteunecontraintesouslaformed'unechanedetexteplaceentreaccolades({}).
Lachaneconstituelecorpscritdansunlangagedecontraintequipeuttre:
naturel
ddi,commeOCL
ouencoredirectementissud'unlangagedeprogrammation.
Siunecontraintepossdeunnom,onprsenteceluicisousformed'unechanesuivied'un
doublepoint(:),letoutprcdantletextedelacontrainte.
413.Reprsentationdescontraintesetcontraintesprdfinies
Figure4.1:UMLpermetd'associerunecontrainteunlmentdemodlede
plusieursfaons.
Surlesdeuxdiagrammesduhaut,lacontrainteportesurunattributquidoittrepositif.Enbas
gauche,lacontrainte{frozen}prcisequelenombrederouesd'unvhiculenepeutpas
varier.Aumilieu,lacontrainte{subset}prcisequeleprsidentestgalementunmembredu
comit.Enfin,enbasdroite,lacontrainte{xor}(ouexclusif)prcisequelesemploysde
l'hteln'ontpasledroitdeprendreunechambredanscemmehtel.
Figure4.2:Cediagrammeexprimeque:unepersonneestnedansunpays,et
quecetteassociationnepeuttremodifieunepersonneavisituncertain
nombredepays,dansunordredonn,etquelenombredepaysvisitsnepeutque
crotreunepersonneaimeraitencorevisitertouteunelistedepays,etquecette
listeestordonne(probablementparordredeprfrence).
UMLpermetd'associerunecontrainteun,ouplusieurs,lment(s)demodledediffrentes
faons(cf.figure4.1):
enplaantdirectementlacontraintectd'unepropritoud'uneoprationdansun
classeur
enajoutantunenoteassociel'lmentcontraindre
enplaantlacontrainteproximitdel'lmentcontraindre,commeuneextrmit
d'associationparexemple
enplaantlacontraintesuruneflcheenpointillsjoignantlesdeuxlmentsdemodle
contraindreensemble,ladirectiondelaflcheconstituantuneinformationpertinenteau
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 2/22
7/27/2017 UML 2 - de l'apprentissage la pratique
seindelacontrainte
enplaantlacontraintesuruntraitenpointillsjoignantlesdeuxlmentsdemodle
contraindreensembledanslecasolacontrainteestbijective
enutilisantunenoterelie,pardestraitsenpointills,chacundeslmentsdemodle,
subissantlacontraintecommune,quandcettecontraintes'appliquesurplusdedeux
lmentsdemodle.
Nousvenonsdevoir,autraversdesexemplesdelafigure4.1,quelquescontraintesprdfinies
({frozen},{subset}et{xor}).Lediagrammedelafigure4.2enintroduitdeuxnouvelles:
{ordered}et{addOnly}.Lalisteestencorelongue,maislepouvoirexpressifdecescontraintes
resteinsuffisantcommenousleverronsdanslasection4.2.2Illustrationparl'exemple.Le
langagedecontraintesobjetOCLapporteunesolutionlgantecetteinsuffisance.
42.Intrtd'OCL
421.OCLIntroduction
421a.QuesacOCL?
C'estavecOCL(ObjectConstraintLanguage)qu'UMLformalisel'expressiondescontraintes.Il
s'agitdoncd'unlangageformeld'expressiondecontraintesbienadaptauxdiagrammesd'UML,
etenparticulieraudiagrammedeclasses.
OCLexistedepuislaversion1.1d'UMLetestunecontributiond'IBM.OCLfaitpartieintgrante
delanormeUMLdepuislaversion1.3d'UML.Danslecadred'UML2.0,lesspcificationsdu
langageOCLfigurentdansundocumentindpendantdelanormed'UML,dcrivantendtailla
syntaxeformelleetlafaond'utilisercelangage.
OCLpeuts'appliquersurlaplupartdesdiagrammesd'UMLetpermetdespcifierdes
contraintessurl'tatd'unobjetoud'unensembled'objetscomme:
desinvariantssurdesclasses
desprconditionsetdespostconditionsl'excutiond'oprations:
lesprconditionsdoiventtrevrifiesavantl'excution,
lespostconditionsdoiventtrevrifiesaprsl'excution
desgardessurdestransitionsdediagrammesd'tatstransitionsoudesmessagesde
diagrammesd'interaction
desensemblesd'objetsdestinatairespourunenvoidemessage
desattributsdrivs,etc.
421b.PourquoiOCL?
Nousavonsditquelescontraintespouvaienttrecritesenlangagenaturel,alorspourquoi
s'embarrasserdulangageOCL?L'intrtdulangagenaturelestqu'ilestsimplemettreen
uvreetcomprhensiblepartous.Parcontre(etcommetoujours),ilestambiguetimprcis,il
renddifficilel'expressiondescontraintescomplexesetnefacilitepaslesrfrencesd'autres
lments(autresqueceluisurlequelportelacontrainte)dumodle.
OCLestunlangageformelvolontairementsimpled'accs.Ilpossdeunegrammaire
lmentaire(OCLpeuttreinterprtpardesoutils)quenousdcrironsdanslessections
4.3TypologiedescontraintesOCL4.6Oprationssurlescollections.OCLreprsente,enfait,
unjustemilieuentrelelangagenatureletunlangagetrstechnique(langagemathmatique,
informatique).Ilpermetainsidelimiterlesambiguts,toutenrestantaccessible.
422.Illustrationparl'exemple
422a.Miseensituation
Plaonsnousdanslecontexted'uneapplicationbancaire.Ilnousfautdoncgrer:
descomptesbancaires
desclients
etdesbanques.
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 3/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Deplus,onaimeraitintgrerlescontraintessuivantesdansnotremodle:
uncomptedoitavoirunsoldetoujourspositif
unclientpeutpossderplusieurscomptes
unepersonnepeuttreclientedeplusieursbanques
unclientd'unebanquepossdeaumoinsuncomptedanscettebanque
uncompteappartientforcmentunclient
unebanquegreplusieurscomptes
unebanquepossdeplusieursclients.
422b.Diagrammedeclasses
Figure4.3:Diagrammedeclassesmodlisantunebanque,sesclientsetleurs
comptes.
Lafigure4.3montreundiagrammedeclassescorrespondantlaproblmatiquequenous
venonsdedcrire.
Figure4.4:Ajoutd'unecontraintesurlediagrammedelafigure4.3.
Unpremierproblmeapparatimmdiatement:riennespcifie,danscediagramme,quele
soldeduclientdoittoujourstrepositif.Pourrsoudreleproblme,onpeutsimplementajouter
unenoteprcisantcettecontrainte({solde>0}),commelemontrelafigure4.4.
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 4/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Figure4.5:Diagrammed'objetscohrentaveclediagrammedeclassesdelafigure
4.4.
Figure4.6:Diagrammed'objetscohrentaveclediagrammedeclassesdelafigure
4.4,maisreprsentantunesituationinacceptable.
Cependant,d'autresproblmessubsistent.Lafigure4.5montreundiagrammed'objetsvalide
visvisdudiagrammedeclassesdelafigure4.4etgalementvalidevisvisdela
spcificationduproblme.Parcontre,lafigure4.6montreundiagrammed'objetsvalidevis
visdudiagrammedeclassesdelafigure4.4maisnerespectantpaslaspcificationdu
problme.Eneffet,cediagrammed'objetsmontreunepersonne(P1)ayantuncomptedans
unebanquesansentreclient.Cediagrammemontregalementunclient(P2)d'unebanque
n'ypossdantpasdecompte.
contextCompte
inv:solde>0
contextCompte::dbiter(somme:int)
pre:somme>0
post:solde=solde@presomme
contextCompte
inv:banque.clients>includes(propritaire)
Figure4.7:Exempled'utilisationdulangagedecontrainteOCLsurl'exemple
bancaire.
LelangageOCLestparticulirementadaptlaspcificationdecetypedecontrainte.Lafigure
4.7montrelediagrammedeclassesdenotreapplicationbancaireaccompagndescontraintes
OCLadapteslaspcificationduproblme.
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 5/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Faitesbienattentionaufaitqu'uneexpressionOCLdcritunecontrainterespecteretnedcrit
absolumentpasl'implmentationd'unemthode.
43.TypologiedescontraintesOCL
431.Diagrammesupportdesexemplesillustratifs
Figure4.8:Diagrammedeclassesmodlisantuneentrepriseetdespersonnes.
Lediagrammedelafigure4.8modlisedespersonnes,leursliensdeparent(enfant/parentet
mari/femme)etleposteventueldecespersonnesdansunesocit.Cediagrammenous
serviradesupportauxdiffrentsexemplesdecontraintesquenousdonnerons,titre
d'illustration,danslessectionsquisuivent(4.3TypologiedescontraintesOCL4.7Exemplesde
contraintes).
Figure4.9:Dfinitiond'unenumrationenutilisantunclasseur.
Cediagrammeintroduitunnouveautypedeclasseur,strotypenumeration,permettant
dedfinirunenumration.UnenumrationestuntypededonneUML,possdantunnom,et
utilispournumrerunensembledelittrauxcorrespondanttouteslesvaleurspossiblesque
peutprendreuneexpressiondecetype.Untypenumrestdfiniparunclasseurpossdant
lestrotypeenumerationcommereprsentsurlafigure4.9.
432.Contexte(context)
Unecontrainteesttoujoursassocieunlmentdemodle.C'estcetlmentquiconstituele
contextedelacontrainte.Ilexistedeuxmanirespourspcifierlecontexted'unecontrainte
OCL:
encrivantlacontrainteentreaccolades({})dansunenote(commenousl'avonsfaitsur
lafigure4.4).L'lmentpointparlanoteestalorslecontextedelacontrainte
enutilisantlemotclefcontextdansundocumentaccompagnantlediagramme(comme
nousl'avonsfaitsurlafigure4.7).
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 6/22
7/27/2017 UML 2 - de l'apprentissage la pratique
432a.Syntaxe
Slectionnez
context <lment>
<lment>peuttreuneclasse,uneopration,etc.Pourfairerfrenceunlmentop
(commeunopration)d'unclasseurC(commeuneclasse),oud'unpaquetageilfaututiliser
les::commesparateur(commeC::op).
432b.Exemple
LecontexteestlaclasseCompte:
contextCompte
Lecontexteestl'oprationgetSolde()delaclasseCompte:
contextCompte::getSolde()
433.Invariants(inv)
Uninvariantexprimeunecontrainteprdicativesurunobjet,ouungrouped'objets,quidoit
trerespecteenpermanence.
433a.Syntaxe
Slectionnez
inv : <expression_logique>
<expression_logique>estuneexpressionlogiquequidoittoujourstrevraie.
433b.Exemple
Lesolded'uncomptedoittoujourstrepositif.
contextCompte
inv:solde>0
Lesfemmes(ausensdel'association)despersonnesdoiventtredesfemmes(ausensdu
genre).
contextPersonne
inv:femme>forAll(genre=Genre::femme)
selfestdcritsection4.5.1Accsauxattributsetauxoprations(self)etforAll()section
4.6.3Oprationsurleslmentsd'unecollection.
434.Prconditionsetpostconditions(pre,post)
Uneprcondition(respectivementunepostcondition)permetdespcifierunecontrainte
prdicativequidoittrevrifieavant(respectivementaprs)l'appeld'uneopration.
Dansl'expressiondelacontraintedelapostcondition,deuxlmentsparticulierssont
utilisables:
l'attributresultquidsignelavaleurretourneparl'opration
et<nom_attribut>@prequidsignelavaleurdel'attribut<nom_attribut>avantl'appel
del'opration.
434a.Syntaxe
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 7/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Prcondition:
Slectionnez
pre : <expression_logique>
Postcondition:
Slectionnez
post : <expression_logique>
<expression_logique>estuneexpressionlogiquequidoittoujourstrevraie.
434b.Exemple
ConcernantlamthodedbiterdelaclasseCompte,lasommedbiterdoittrepositivepour
quel'appeldel'oprationsoitvalideet,aprsl'excutiondel'opration,l'attributsoldedoit
avoirpourvaleurladiffrencedesavaleuravantl'appeletdelasommepasseenparamtre.
contextCompte::dbiter(somme:Real)
pre:somme>0
post:solde=solde@presomme
Lersultatdel'appeldel'oprationgetSoldedoittregall'attributsolde.
contextCompte::getSolde():Real
post:result=solde
Mmesicelapeutsemblertrelecasdanscesexemples,nousn'avonspasdcritcomment
l'oprationestralise,maisseulementlescontraintessurl'tatavantetaprssonexcution.
435.Rsultatd'unemthode(body)
Cetypedecontraintepermetdedfinirdirectementlersultatd'uneopration.
435a.Syntaxe
Slectionnez
body : <requte>
<requte>estuneexpressionquiretourneunrsultatdontletypedoittrecompatibleavecle
typedursultatdel'oprationdsigneparlecontexte.
435b.Exemple
Voiciuneautresolutionaudeuximeexempledelasection4.3.4Prconditionsetpostconditions
(pre,post):lersultatdel'appeldel'oprationgetSoldedoittregall'attributsolde.
contextCompte::getSolde():Real
body:solde
436.Dfinitiond'attributsetdemthodes(defetletin)
Parfois,unesousexpressionestutiliseplusieursfoisdansuneexpression.letpermetde
dclareretdedfinirlavaleur(i.e.initialiser)d'unattributquipourratreutilisdans
l'expressionquisuitlein.
defestuntypedecontraintequipermetdedclareretdedfinirlavaleurd'attributscommela
squenceletin.defpermetgalementdedclareretdedfinirlavaleurretourneparune
oprationinternelacontrainte.
436a.Syntaxedeletin
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 8/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Slectionnez
let <dclaration> = <requte> in <expression>
Unnouvelattributdclardans<dclaration>auralavaleurretourneparl'expression
<requte>danstoutel'expression<expression>.
Reportezvouslasection4.7Exemplesdecontraintespourunexempled'utilisation.
436b.Syntaxededef
Slectionnez
def : <dclaration> = <requte>
<dclaration>peutcorrespondreladclarationd'unattributoud'unemthode.<requte>
estuneexpressionquiretourneunrsultatdontletypedoittrecompatibleavecletypede
l'attribut,oudelamthode,dclardans<dclaration>.Danslecasoils'agitd'unemthode,
<requte>peututiliserlesparamtresspcifisdansladclarationdelamthode.
436c.Exemple
Pourimposerqu'unepersonnemajeuredoitavoirdel'argent,onpeutcrireindiffremment:
contextPersonne
inv:letargent=compte.solde>sum()inage>=18impliesargent>0
contextPersonne
def:argent:int=compte.solde>sum()
contextPersonne
inv:age>=18impliesargent>0
sum()estdcritsection4.6.2Oprationsdebasesurlescollections.
437.Initialisation(init)etvolutiondesattributs(derive)
Letypedecontrainteinitpermetdeprciserlavaleurinitialed'unattributoud'uneterminaison
d'association.
Lesdiagrammesd'UMLdfinissentparfoisdesattributsoudesassociationsdrives.Lavaleur
detelslmentsesttoujoursdtermineenfonctionsd'autreslmentsdudiagramme.Letype
decontraintederivepermetdeprcisercommentlavaleurdecetyped'lmentvolue.
Notezbienladiffrenceentrecesdeuxtypesdecontraintes.Lacontraintederiveimposeune
contrainteperptuelle:l'lmentdrivdoittoujoursavoirlavaleurimposeparl'expression
delacontraintederive.D'unautrect,lacontrainteinitnes'appliquequ'aumomentdela
crationd'uneinstanceprciseparlecontextedelacontrainte.Ensuite,lavaleurdel'lment
peutfluctuerindpendammentdelacontrainteinit.
437a.Syntaxe
Slectionnez
init : <requte>
derive : <requte>
437b.Exemple
Quandoncreunepersonne,lavaleurinitialedel'attributmariestfauxetlapersonnene
possdepasd'employeur:
contextPersonne::mari:Boolean
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 9/22
7/27/2017 UML 2 - de l'apprentissage la pratique
init:false
contextPersonne::employeur:Set(Socit)
init:Set{}
Lescollections(dontSetestuneinstance)sontdcritessection4.4.4Collections.Set{}
correspondunensemblevide.
L'ged'unepersonneestladiffrenceentreladatecouranteetladatedenaissancedela
personne:
contextPersonne::age:Integer
derive:date_de_naissanceDate::current()
OnsupposeiciqueletypeDatepossdeunemthodedeclassepermettantdeconnatreladate
couranteetquel'oprationmoins()entredeuxdatesestbiendfinieetretourneunnombre
d'annes.
44.TypesetoprationsutilisablesdanslesexpressionsOCL
441.Typesetoprateursprdfinis
LelangageOCLpossdeuncertainnombredetypesprdfinisetd'oprationsprdfiniessur
cestypes.Cestypesetcesoprationssontutilisablesdansn'importequellecontrainteetsont
indpendantsdumodleauquelsontrattachescescontraintes.
Letableau4.1donneunaperudestypesetoprationsprdfinisdanslescontraintesOCL.Les
tableaux4.2et4.3rappellentlesconventionsd'interprtationdesoprateurslogiques.
L'oprateurlogiqueifthenelseendifestunpeuparticulier.Sasyntaxeestlasuivante:
Slectionnez
if <expression_logique_0>
then <expression_logique_1>
else <expression_logique_2>
endif
Cetoprateurs'interprtedelafaonsuivante:si<expression_logique_0>estvrai,alorsla
valeurdevritdel'expressionestcellede<expression_logique_1>,sinon,c'estcellede
<expression_logique_2>.
Tableau4.1:TypesetoprateursprdfinisdanslescontraintesOCL.
Type Exemplesdevaleurs Oprateurs
andorxornotimpliesif
Boolean truefalse
thenelseendif
Integer 1523426524 *+/abs()
Real 1,53,14 *+/abs()floor()
concat()size()substring()
String "Tobeornottobe"
Tableau4.2:Interprtationdesquatreconnecteurs,E1etE2sontdeuxexpressionslogiques.
E1 E2 P1andP2 P1orP2 P1xorP2 P1impliesP2
VRAI VRAI VRAI VRAI FAUX VRAI
VRAI FAUX FAUX VRAI VRAI FAUX
FAUX VRAI FAUX VRAI VRAI VRAI
FAUX FAUX FAUX FAUX FAUX VRAI
Tableau4.3:Convention
d'interprtationdela
ngation.
expression not
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 10/22
7/27/2017 UML 2 - de l'apprentissage la pratique
expression
VRAI FAUX
FAUX VRAI
442.TypesdumodleUML
TouteexpressionOCLestcritedanslecontexted'unmodleUMLdonn.Bienentendu,tous
lesclasseursdecemodlesontdestypesdanslesexpressionsOCLattachescemodle.
Danslasection4.3.1Diagrammesupportdesexemplesillustratifs,nousavonsintroduitletype
numr.UnecontrainteOCLpeutrfrencerunevaleurdecetypedelamaniresuivante:
Slectionnez
<nom_type_enumr>::valeur
Parexemple,laclassePersonnepossdeunattributgenredetypeGenre.Onpeutdonccrirela
contrainte:
Slectionnez
context Personne
inv: genre = Genre::femme
Danscecas,touteslespersonnesdoiventtredesfemmes.
443.OCLestunlangagetyp
OCLestunlangagetypdontlestypessontorganisssousformedehirarchie.Cette
hirarchiedterminecommentdiffrentstypespeuventtrecombins.Parexemple,ilest
impossibledecomparerunboolen(Boolean)avecunentier(Integer)ouunechanede
caractres(String).Parcontre,ilestpossibledecomparerunentier(Integer)etunrel(Real),
carletypeentierestunsoustypedutypereldanslahirarchiedestypesOCL.Bienentendu,
lahirarchiedestypesdumodleUMLestdonneparlarelationdegnralisationentreles
classeursdumodleUML.
444.Collections
OCLdfinitgalementlanotiond'ensemblesousletermegnriquedecollection(collectionen
anglais).IlexisteplusieurssoustypesdutypeabstraitCollection:
Ensemble(Set):
collectionnonordonned'lmentsuniques(i.e.pasd'lmentendouble)
Ensembleordonn(OrderedSet):
collectionordonned'lmentsuniques
Sac(Bag):
collectionnonordonned'lmentsidentifiables(i.e.commeunensemble,maispouvant
comporterdesdoublons)
Squence(Sequence):
collectionordonned'lmentsidentifiables.
Jusqu'UML2.0exclu,lescollectionstaienttoujoursplates:unecollectionnepouvaitpas
possderdescollectionscommelments.Cetterestrictionn'existepluspartird'UML2.0.
45.Accsauxcaractristiquesetauxobjets
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 11/22
7/27/2017 UML 2 - de l'apprentissage la pratique
DansunecontrainteOCLassocieunobjet,ilestpossibled'accderauxcaractristiques
(attributs,oprationsetterminaisond'association)decetobjet,etdonc,d'accderdemanire
transitivetouslesobjets(etleurscaractristiques)aveclesquelsilestenrelation.
451.Accsauxattributsetauxoprations(self)
Pourfairerfrenceunattributouuneoprationdel'objetdsignparlecontexte,ilsuffit
d'utiliserlenomdecetlment.L'objetdsignparlecontexteestgalementaccessiblepar
l'expressionself.Onpeutdoncgalementutiliserlanotationpointe:self.<proprit>.
Uneoprationpeutavoirdesparamtres,ilfautalorslesprciserentrelesparenthsesde
l'opration.
Lorsquelamultiplicitd'unattribut,detypeT,n'estpas1(doncs'ils'agitd'untableau),la
rfrencecetattributestdutypeensemble(i.e.Set(T)).
Parexemple,danslecontextedelaclasseCompte,onpeututiliserlesexpressionssuivantes:
solde
self.solde
getSolde()
self.getSolde()
dbiter(1000)
self.dbiter(1000).
Dansl'exempleprcdent,lersultatdel'expressionself.dbiter(1000)estunsingletondutype
Real.Maisuneoprationpeutcomporterdesparamtresdfinisensortieouenentre/sortie.
Danscecas,lersultatserauntuplecontenanttouslesparamtresdfinisensortieouen
entre/sortie.Parexemple,imaginonsuneoprationdontladclarationseraitoperation(out
param_out:Integer):Realpossdantunparamtredfiniensortieparam_out.Danscecas,le
rsultatdel'expressionoperation(paramtre)estuntupledelaforme(param_out:Integer,
result:Real).Onpeutaccderauxvaleursdecetupledelafaonsuivante:
Slectionnez
operation(paramtre).param_out
operation(paramtre).result
452.Navigationviauneassociation
Pourfairerfrenceunobjet,ouungrouped'objets,enassociationavecl'objetdsignparle
contexte,ilsuffitd'utiliserlenomdelaclasseassocie(enminuscules)oulenomdurle
d'associationductdecetteclasse.Quandc'estpossible,ilestprfrabled'utiliserlenomde
rledel'associationductdel'objetauquelondsirefairerfrence.C'estindispensables'il
existeplusieursassociationsentrel'objetdsignparlecontexteetl'objetauquelondsire
accder,ousil'associationemprunteestrflexive.
Letypedursultatdpenddelapropritstructurelleempruntepouraccderl'objet
rfrenc,etplusprcismentdelamultiplicitductdel'objetrfrenc,etdutypede
l'objetrfrencproprementdit.SionappelleXlaclassedel'objetrfrenc,danslecasd'une
multiplicitde:
1,letypedursultatestX(ex.: )
*ou0..n,letypedursultatestSet(X)(ex.: )
*ou0..n,ets'ilyaenplusunecontrainte{ordered},letypedursultatest
OrderedSet(X)(ex.: ).
EmprunteruneseulepropritstructurellepeutproduireunrsultatdutypeSet(ou
OrderedSet).EmprunterplusieurspropritsstructurellespeutproduireunrsultatdutypeBag
(ouSequence).
Parexemple,danslecontextedelaclasseSocit(contextSocit):
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 12/22
7/27/2017 UML 2 - de l'apprentissage la pratique
directeurdsigneledirecteurdelasocit(rsultatdetypePersonne)
employdsignel'ensembledesemploysdelasocit(rsultatdetypeSet(Personne))
employ.comptedsignel'ensembledescomptesdetouslesemploysdelasocit
(rsultatdetypeBag(Compte))
employ.date_de_naissancedsignel'ensembledesdatesdenaissancedesemploysde
lasocit(rsultatdetypeBag(Date)).
453.Navigationviauneassociationqualifie
Figure4.10:DiagrammeillustrantuneassociationqualifieentreuneclasseBanque
etuneclassePersonne.
Uneassociationqualifie(cf.section3.3.6Qualification)utiliseunouplusieursqualificatifspour
slectionnerdesinstancesdelaclassecibledel'association.Pouremprunterunetelle
association,ilestpossibledespcifierlesvaleurs,oulesinstances,desqualificatifsenutilisant
descrochets([]).
Plaonsnousdanslecadredudiagrammedelafigure4.10.Danslecontextedebanque
(contextBanque),pourfairerfrenceaunomdesclientsdontlecompteportelenumro
19503800ilfautcrire:
Slectionnez
self.client[19503800].nom
Danslecasoilyaplusieursqualificatifs,ilfautsparerchacunedesvaleursparunevirguleen
respectantl'ordredesqualificatifsdudiagrammeUML.Iln'estpaspossibledeneprciserla
valeurquedecertainsqualificatifsenenlaissantd'autresnondfinis.Parcontre,ilestpossible
deneprciseraucunevaleurdequalificatif:
Slectionnez
self.client.nom
Danscecas,lersultatseral'ensembledesnomsdetouslesclientsdelabanque.
Ainsi,sionneprcisepaslavaleurdesqualificatifsenempruntantuneassociationqualifie,
toutsepassecommesil'associationn'taitpasqualifie.Danscecas,faitesattentionla
cardinalitdelaciblequichangequandl'associationn'estplusqualifie(cf.section
3.3.6Qualification).
454.Navigationversuneclasseassociation
Pournaviguerversuneclasseassociation,ilfaututiliserlanotationpointeclassiqueen
prcisantlenomdelaclasseassociationenminuscules.Parexemple,danslecontextedela
classeSocit(contextSocit),pouraccderausalairedetouslesemploys,ilfautcrire:
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 13/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Slectionnez
self.poste.salaire
Cependant,danslecasol'associationestrflexive(c'estlecasdelaclasseassociation
Mariage),ilfautenplusprciserparquelleextrmitilfautemprunterl'association.Pourcela,
onprciselenomderledel'unedesextrmitsdel'associationentrecrochets([])derrirele
nomdelaclasseassociation.Parexemple,danslecontextedelaclassePersonne(context
Personne),pouraccderladatedemariagedetouteslesfemmes,ilfautcrire:
Slectionnez
self.mariage[femme].date
455.Navigationdepuisuneclasseassociation
Ilesttoutfaitpossibledenaviguerdirectementdepuisuneclasseassociationversuneclasse
participante.
Exemple:
Slectionnez
context Poste
inv: self.employ.age > 21
Pardfinitionmmed'uneclasseassociation,naviguerdepuisuneclasseassociationversune
classeparticipanteproduittoujourscommersultatunobjetunique.Parexemple,l'expression
self.employ.agedel'exempleprcdantproduitbienunsingleton.
456.Accderunecaractristiqueredfinie(oclAsType())
Quandunecaractristiquedfiniedansuneclasseparenteestredfiniedansunesousclasse
associe,lacaractristiquedelaclasseparenteresteaccessibledanslasousclasseenutilisant
l'expressionoclAsType().
SupposonsuneclasseBhritantd'uneclasseAetunepropritp1dfiniedanslesdeux
classes.DanslecontextedelaclasseB(contextB),pouraccderlapropritp1deB,on
critsimplement:
Slectionnez
self.p1
etpouraccderlapropritp1deA(toujoursdanslecontextedeB),ilfautcrire:
Slectionnez
self.oclAsType(A).p1
457.Oprationsprdfiniessurtouslesobjets
L'oprationoclAsType,quenousvenonsdedcrire(section4.5.6Accderunecaractristique
redfinie(oclAsType())),estuneoprationprdfiniedanslelangageOCLquipeuttre
appliquetoutobjet.LelangageOCLenproposeplusieurs:
oclIsTypeOf(t:OclType):Boolean
oclIsKindOf(t:OclType):Boolean
oclInState(s:OclState):Boolean
oclIsNew():Boolean
oclAsType(t:OclType):instanceofOclType
457a.OprationoclIsTypeOf
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 14/22
7/27/2017 UML 2 - de l'apprentissage la pratique
oclIsTypeOfretournevraisiletypedel'objetautitreduquelcetteoprationestinvoqueest
exactementlemmequeletypetpassenparamtre.
Parexemple,danslecontextedeSocit,l'expressiondirecteur.oclIsTypeOf(Personne)estvraie
tandisquel'expressionself.oclIsTypeOf(Personne)estfausse.
457b.OprationoclIsKindOf
oclIsKindOfpermetdedterminersiletypetpassenparamtrecorrespondexactementau
typeouuntypeparentdutypedel'objetautitreduquelcetteoprationestinvoque.
Parexemple,supposonsuneclasseBhritantd'uneclasseA:
danslecontextedeB,l'expressionself.oclIsKindOf(B)estvraie
toujoursdanslecontextedeB,l'expressionself.oclIsKindOf(A)estvraie
maisdanslecontextedeA,l'expressionself.oclIsKindOf(B)estfausse.
457c.OprationoclIsNew
L'oprationoclIsNewdoittreutilisedansunepostcondition.Elleestvraiequandl'objetau
titreduquelelleestinvoqueestcrpendantl'opration(i.e.l'objetn'existaitpasaumoment
desprconditions).
457d.OprationoclInState
Cetteoprationestutilisedansundiagrammed'tatstransitions(cf.section5Chapitre5
Diagrammed'tatstransitions(Statemachinediagram)).Elleestvraiesil'objetdcritparle
diagrammed'tatstransitionsestdansl'tatspassenparamtre.Lesvaleurspossiblesdu
paramtressontlesnomsdestatsdudiagrammed'tatstransitions.Onpeutfairerfrence
untatimbriquenutilisantdes::(parexemple,pourfairerfrenceuntatBimbriqu
dansuntatA,oncrit:A::B).
458.Oprationsurlesclasses
Touteslesoprationsquenousavonsdcritesjusqu'icis'appliquaientsurdesinstancesde
classe.Cependant,OCLpermetgalementd'accderdescaractristiquesdeclasse(cellesqui
sontsoulignesdansundiagrammedeclasses).Pourcela,onutiliselenomqualifidelaclasse
suivid'unpointpuisdunomdelapropritoudel'opration:<nom_qualifi>.<proprit>.
LelangageOCLdisposegalementd'uneoprationprdfiniesurlesclasses,lesinterfaceset
lesnumrations(allInstances)quiretournel'ensemble(Set)detouteslesinstancesdutypeau
titreduquelelleestinvoque,aumomentol'expressionestvalue.Parexemple,pour
dsignerl'ensembledesinstancesdelaclassepersonne(typeset(Personne))oncrit:
Slectionnez
Personne.allInstances()
46.Oprationssurlescollections
461.Introduction:.,>,::etself
Commenousl'avonsvudanslasectionprcdente(4.5Accsauxcaractristiquesetaux
objets),pouraccderauxcaractristiques(attributs,terminaisonsd'associations,oprations)
d'unobjet,OCLutiliselanotationpointe:<objet>.<proprit>.Cependant,denombreuses
expressionsneproduisentpascommersultatunobjet,maisunecollection.LelangageOCL
proposeplusieursoprationsdebasesurlescollections.Pouraccdercetyped'opration,il
faut,utilisernonpasunpoint,maisuneflche:<collection>><opration>.Enfin,rappelons
quepourdsignerunlmentdansunlmentenglobantonutiliseles::(cf.Section
4.3.2Contexte(context)et4.5.7Oprationsprdfiniessurtouslesobjetsparexemple).En
rsum:
::
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 15/22
7/27/2017 UML 2 - de l'apprentissage la pratique
permetdedsignerunlment(commeuneopration)dansunlmentenglobant
(commeunclasseurouunpaquetage)
permetd'accderunecaractristique(attributs,terminaisonsd'associations,oprations)
d'unobjet
>
permetd'accderunecaractristiqued'unecollection.
Nousavonsditdanslasection4.5.1Accsauxattributsetauxoprations(self)quel'objet
dsignparlecontexteestgalementaccessibleparl'expressionself.selfn'estpasuniquement
utilispourdsignerlecontexted'unecontraintedansuneexpression,maisgalementpour
dsignerlecontexted'unesousexpressiondansletexte(enlangagenaturel).Ainsi,lorsque
l'onutiliseselfpouruneopration<opration>,c'estpourdsignerl'objet(commeune
collectionparexemple)surlequelportel'opration.Cetobjetpeuttrelersultatd'une
oprationintermdiairecommel'valuationdel'expression<expression>prcdantl'opration
<opration>dansl'expressioncomplte:<expression>.<opration>.
462.Oprationsdebasesurlescollections
Nousnedcrironspastouteslesoprationssurlescollectionsetsessoustypes(ensemble)
danscettesection.Rfrezvousladocumentationofficielle[19]pourplusd'exhaustivit.
462a.Oprationsdebasesurlescollections
NousdcrivonsiciquelquesoprationsdebasesurlescollectionsqueproposelelangageOCL.
size():Integer
retournelenombred'lments(lacardinalit)deself.
includes(objet:T):Boolean
vraisiselfcontientl'objetobjet.
excludes(objet:T):Boolean
vraisiselfnecontientpasl'objetobjet.
count(objet:T):Integer
retournelenombred'occurrencesdeobjetdansself.
includesAll(c:Collection(T)):Boolean
vraisiselfcontienttousleslmentsdelacollectionc.
excludesAll(c:Collection(T)):Boolean
vraisiselfnecontientaucunlmentdelacollectionc.
isEmpty()
vraisiselfestvide.
notEmpty()
vraisiselfn'estpasvide.
sum():T
retournelasommedeslmentsdeself.Leslmentsdeselfdoiventsupporter
l'oprateursomme(+)etletypedursultatdpenddutypedeslments.
product(c2:Collection(T2)):Set(Tuple(first:T,second:T2))
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 16/22
7/27/2017 UML 2 - de l'apprentissage la pratique
lersultatestlacollectiondeTuplescorrespondantauproduitcartsiendeself(detype
Collection(T))parc2.
462b.Oprationsdebasesurlesensembles(Set)
Nousdcrivonsiciquelquesoprationsdebasesurlesensembles(typeSet)queproposele
langageOCL.
union(set:Set(T)):Set(T)
retournel'uniondeselfetset.
union(bag:Bag(T)):Bag(T)
retournel'uniondeselfetbag.
=(set:Set(T)):Boolean
vraisiselfetsetcontiennentlesmmeslments.
intersection(set:Set(T)):Set(T)
intersectionentreselfetset.
intersection(bag:Bag(T)):Set(T)
intersectionentreselfetbag.(12)
including(objet:T):Set(T)
Lersultatcontienttousleslmentsdeselfplusl'objetobjet.
excluding(objet:T):Set(T)
Lersultatcontienttousleslmentsdeselfsansl'objetobjet.
(set:Set(T)):Set(T)
Lersultatcontienttousleslmentsdeselfsansceuxdeset.
asOrderedSet():OrderedSet(T)
permetdeconvertirselfdutypeSet(T)enOrderedSet(T).
asSequence():Sequence(T)
permetdeconvertirselfdutypeSet(T)enSequence(T).
asBag():Bag(T)
permetdeconvertirselfdutypeSet(T)enBag(T).
Lessacs(typeBag)disposentd'oprationsanalogues.
462c.Exemples
1.Unesocitaaumoinsunemploy:
contextSocitinv:self.employ>notEmpty()
2.Unesocitpossdeexactementundirecteur:
contextSocitinv:self.directeur>size()=1
3.Ledirecteurestgalementunemploy:
contextSocitinv:self.employ>includes(self.directeur)
463.Oprationsurleslmentsd'unecollection
463a.Syntaxegnrale
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 17/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Lasyntaxed'uneoprationportantsurleslmentsd'unecollectionestlasuivante:
Slectionnez
<collection> -> <opration>( <expression> )
Danstouslescas,l'expression<expression>estvaluepourchacundeslmentsdela
collection<collection>.L'expression<expression>portesurlescaractristiquesdeslments
enlescitantdirectementparleurnom.Lersultatdpenddel'opration<opration>.
Parfois,dansl'expression<expression>,ilestprfrabledefairerfrenceauxcaractristiques
del'lmentcourantenutilisantlanotationpointe:<lment>.<proprit>.Pourcela,on
doitutiliserlasyntaxesuivante:
Slectionnez
<collection> -> <opration>( <lment> | <expression> )
<lment>jouealorsunrled'itrateuretsertderfrencel'lmentcourantdans
l'expression<expression>.
Ilestgalementpossible,afind'treplusexplicite,deprciserletypedecetlment:
Slectionnez
<collection> -> <opration>( <lment> : <Type> | <expression> )
Lasyntaxegnraled'uneoprationportantsurleslmentsd'unecollectionestdoncla
suivante:
Slectionnez
<collection> -> <opration>( [ <lment> [ : <Type> ] | ] <expression> )
463b.Oprationselectetreject
Cesdeuxoprationspermettentdegnrerunesouscollectionenfiltrantleslmentsdela
collectionself.Leursyntaxeestlasuivante:
Slectionnez
select( [ <lment> [ : <Type> ] | ] <expression_logique> )
reject( [ <lment> [ : <Type> ] | ] <expression_logique> )
select
permetdegnrerunesouscollectiondeselfnecontenantquedeslmentsquisatisfont
l'expressionlogique<expression_logique>.
reject
permetdegnrerunesouscollectioncontenanttousleslmentsdeselfexceptceux
quisatisfontl'expressionlogique<expression_logique>.
Parexemple,pourcrireunecontrainteimposantquetoutesocitdoitpossder,parmises
employs,aumoinsunepersonnedeplusde50ans,onpeutcrireindiffremment:
1.contextSocit
inv:self.employ>select(age>50)>notEmpty()
2.contextSocit
inv:self.employ>select(individu|individu.age>50)>notEmpty()
3.contextSocit
inv:self.employ>select(individu:Personne|individu.age>50)>notEmpty()
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 18/22
7/27/2017 UML 2 - de l'apprentissage la pratique
463c.OprationforAlletexists
Cesdeuxoprationspermettentdereprsenterlequantificateuruniversel()etle
quantificateurexistentiel().LersultatdecesoprationsestdoncdutypeBoolean.Leur
syntaxeestlasuivante:
Slectionnez
forAll( [ <lment> [ : <Type> ] | ] <expression_logique> )
exists( [ <lment> [ : <Type> ] | ] <expression_logique> )
forAll
permetd'crireuneexpressionlogiquevraiesil'expression<expression_logique>est
vraiepourtousleslmentsdeself.
exists
permetd'crireuneexpressionlogiquevraiesil'expression<expression_logique>est
vraiepouraumoinsunlmentdeself.
Parexemple,pourcrireunecontrainteimposantquetoutesocitdoitpossder,parmises
employs,aumoinsunepersonnedeplusde50ans,onpeutcrire:
contextSocit
inv:self.employ>exists(age>50)
L'oprationforAllpossdeunevariantetenduepossdantplusd'unitrateur.Danscecas,
chacundesitrateursparcourral'ensembledelacollection.Concrtement,uneoprationforAll
comportantdeuxitrateursestquivalenteuneoprationforAlln'encomportantqu'un,mais
ralisesurleproduitcartsiendeselfparluimme.
Parexemple,imposerqu'iln'existepasdeuxinstancesdelaclassePersonnepourlesquelles
l'attributnomalammevaleur,c'estdirepourimposerquedeuxpersonnesdiffrentesont
unnomdiffrent,onpeutcrireindiffremment:
1.contextPersonne
inv:Personne.allInstances()>forAll(p1,p2|p1<>p2impliesp1.nom<>p2.nom)
2.contextPersonne
inv:(Personne.allInstances().product(Personne.allInstances()))
>forAll(tuple|tuple.first<>tuple.secondimpliestuple.first.nom<>tuple.second.nom)
463d.Oprationcollect
Cetteoprationpermetdeconstruireunenouvellecollectionenutilisantlacollectionself.La
nouvellecollectionconstruitepossdelemmenombred'lmentsquelacollectionself,maisle
typedeceslmentsestgnralementdiffrent.Lasyntaxedel'oprateurcollectestla
suivante:
Slectionnez
collect( [ <lment> [ : <Type> ] | ] <expression> )
Pourchaquelmentdelacollectionself,l'oprateurcollectvaluel'expression<expression>
surcetlmentetajoutelersultatdanslacollectiongnre.
Parexemple,pourdfinirlacollectiondesdatesdenaissancedesemploysd'unesocit,ilfaut
crire,danslecontextedelaclasseSocit:
Slectionnez
self.employ->collect(date_de_naissance)
Puisque,toujoursdanslecontextedelaclasseSocit,l'expressionself.employ
>collect(date_de_naissance)>size()=self.employ>size()esttoujoursvraie,ilfauten
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 19/22
7/27/2017 UML 2 - de l'apprentissage la pratique
conclurequelersultatd'uneoprationcollectsurunecollectiondutypeSetn'estpasdutype
Set,maisdutypeBag.Eneffet,danslecadredenotreexemple,ilyauracertainementdes
doublonsdanslesdatesdenaissance.
464.Rglesdeprcdencedesoprateurs
Ordredeprcdencepourlesoprateursparordredeprioritdcroissante:
1.@pre
2..et>
3.notet(oprateurunaire)
4.*et/
5.+et(oprateurbinaire)
6.ifthenelseendif
7.<,>,<=et>=
8.=et<>
9.and,oretxor
10.implies
Lesparenthses,(et),permettentdechangercetordre.
47.Exemplesdecontraintes
Figure4.11:Reprisedudiagrammedelafigure4.8.
Danscettesection,nousallonsillustrerparquelquesexemplesl'utilisationdulangageOCL.
Nousrestonstoujourssurlediagrammedeclassesdelafigure4.8reprsentnouveausurla
figure4.11pourdesraisonsdeproximit.
Dansunesocit,ledirecteurestunemploy,n'estpasunchmeuretdoitavoirplusde40
ans.Deplus,unesocitpossdeexactementundirecteuretaumoinsunemploy.
Slectionnez
context Socit
inv :
self.directeur->size()=1 and
not(self.directeur.chmeur) and
self.directeur.age > 40 and
self.employ->includes(self.directeur)
Unepersonneconsidrecommeauchmagenedoitpasavoirdesrevenussuprieurs100.
Slectionnez
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 20/22
7/27/2017 UML 2 - de l'apprentissage la pratique
context Personne
inv :
let revenus : Real = self.poste.salaire->sum() in
if chmeur then
revenus < 100
else
revenus >= 100
endif
Unepersonnepossdeauplusdeuxparents(rfrencs).
Slectionnez
context Personne
13. inv : parent->size()<=2
Siunepersonnepossdedeuxparents,l'unestunefemmeetl'autreunhomme.
Slectionnez
context Personne
inv :
parent->size()=2 implies
( parent->exists(genre=Genre::homme) and
parent->exists(genre=Genre::femme) )
Touslesenfantsd'unepersonneontbiencettepersonnecommeparentetinversement.
Slectionnez
context Personne
inv :
enfant->notEmpty() implies
enfant->forAll( p : Personne | p.parents->includes(self))
context Personne
inv :
parent->notEmpty() implies
parent->forAll ( p : Personne | p.enfant->includes (self))
Pourtremari,ilfautavoirunefemmeouunmari.
Slectionnez
context Personne::mari
derive : self.femme->notEmpty() or self.mari->notEmpty()
Pourtremari,ilfautavoirplusde18ans.Unhommeestmariavecexactementunefemme
etunefemmeavecexactementunhomme.
Slectionnez
context Personne
inv :
self.mari implies
self.genre=Genre::homme implies (
self.femme->size()=1 and
self.femme.genre=Genre::femme)
and self.genre=Genre::femme implies (
self.mari->size()=1 and
self.mari.genre=Genre::homme)
and self.age >=18
(12)
Non,iln'yapasd'erreurdecopier/coller:rflchissez!
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 21/22
7/27/2017 UML 2 - de l'apprentissage la pratique
Lessourcesprsentessurcettepagesontlibresdedroitsetvouspouvezlesutiliservotre
convenance.Parcontre,lapagedeprsentationconstitueuneuvreintellectuelleprotgeparles
droitsd'auteur.Copyright2013LaurentAUDIBERT.Aucunereproduction,mmepartielle,nepeut
trefaitedecesiteetdel'ensembledesoncontenu:textes,documents,images,etc.sans
l'autorisationexpressedel'auteur.Sinonvousencourezselonlaloijusqu'troisansdeprisonet
jusqu'300000dedommagesetintrts.
ContacterleresponsabledelarubriqueUML
http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 22/22