You are on page 1of 22

7/27/2017 UML 2 - de l'apprentissage la pratique

Forums Tutoriels Magazine FAQs Blogs Chat Newsletter Rechercher


tudes Emploi Club Contacts

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

Applications Mobiles Systmes ALM Merise UML

ACCUEILUML FORUMUML F.A.QUML TUTORIELSUML LIVRESUML OUTILSUML

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

Nouscontacter Participez Hbergement Informationslgales


Copyright20002017www.developpez.com

http://laurent-audibert.developpez.com/Cours-UML/?page=object-constraint-langage-ocl 22/22

You might also like