Chapitre 4: Object Constraint Language (OCL)

Programming, Object-Oriented Modeling, UML · course

Browse all génie logiciel documents

Chapitre4: Object Constraint Language

(OCL)

Cours Ing nierie Dirig e par les mod les

Cours Ing nierie Dirig e par les mod les

Niveau: II3 ILSI

Enseignante: Rim DRIRA

[email protected]

Bureau 215

AU: 2016/2017

Plan

1. Pourquoi OCL

2. Contexte dune contrainte

3. Syntaxe dOCL

2

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

OCL (Object Constraint Language)

UML permet dexprimer diff rents types de contraintes:

contraintes structurelles: les attributs, les diff rents types de relations

entre classes, cardinalit s, etc.

contraintes de type: le typage des attributs, etc.

contraintes pr d finies sur les associations: {subset}, {xor}, etc.

contraintes en langue naturelle (commentaires)

contraintes en langue naturelle (commentaires)

diverses autres contraintes comme les contraintes de visibilit , des

classes abstraites, etc.

TOUTEFOIS

Certaines contraintes ne peuvent pas tre formalis es avec UML.

Afin de combler cette lacune, lOMG a propos un langage dexpression

de contraintes appel OCL.

3

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pourquoi OCL ? Illustration par l'exemple

Application bancaire qui manipulent les classes Compte,

Personne et Banque

1.

2.

3.

4.

5.

6.

7.

8.

Un client peut poss der plusieurs comptes

Un compte doit avoir un solde toujours positif.

Un client peut tre client de plusieurs banques

Un client d'une banque poss de au moins un compte dans cette

banque

banque

Les clients de la banque associ e un compte doivent contenir le

propri taire de ce compte

Une banque g re plusieurs comptes

Une banque poss de plusieurs clients

Les m thodes quon pourra appliquer sur Compte sont:

cr diter(int), d biter(int) et int getSolde()

Quelles sont les sp cifications non exprim es par le

diagramme de classe propos ??

4

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pourquoi OCL ? Illustration par l'exemple

Le diagramme de classe ne permet pas dexprimer:

2. Un compte doit avoir un solde toujours positif

4. Un client d'une banque poss de au moins un compte dans cette

banque

5. Les clients de la banque associ e un compte doivent

5. Les clients de la banque associ e un compte doivent

contenir le propri taire de ce compte

5

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pourquoi OCL ? Illustration par l'exemple

Diagramme d'objets coh rent avec le diagramme de classes et la

sp cification:

6

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pourquoi OCL ? Illustration par l'exemple

Diagramme d'objets coh rent avec le diagramme de classes mais

qui ne respecte pas la sp cification attendue.

Une personne a un compte dans une banque o elle n'est pas cliente

Une personne est cliente d'une banque mais sans y avoir de compte

7

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Diagrammes UML insuffisants

Pour sp cifier compl tement une application

Diagrammes UML seuls sont g n ralement insuffisants

N cessit de rajouter des contraintes

Comment exprimer ces contraintes ?

Langue naturelle mais manque de pr cision, compr hension pouvant

tre ambig e

Langage formel avec s mantique pr cise : OCL

8

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

OCL, cest quoi?

Langage de description de contraintes d'UML, peut sappliquer sur

diff rents diagrammes UML

Standardis par l'OMG

Version 2.3.1: http://www.omg.org/spec/OCL/ISO/19507/PDF/

Version actuelle: 2.5 http://www.omg.org/spec/OCL/2.5

Objectif: Sp cifier des contraintes suppl mentaires importantes

qui n'ont pas pu tre sp cifi s avec les l ments de mod lisation

d'UML

S'applique aussi sur MOF

9

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Utilisation dOCL

OCL permet principalement d'exprimer deux types de contraintes sur l' tat

Advertisement

d'un objet ou d'un ensemble d'objets:

Invariant de classe: une contrainte qui doit tre respect e en permanence

par toutes les instances d'une classe.

pr -condition et post-conditions l'ex cution d'une op ration:

Permet aussi dexprimer:

Permet aussi dexprimer:

contraintes sur la valeur retourn e par une m thode

r gles de d rivation des attributs

Gardes sur transitions de diagrammes d' tats ou de messages de diagrammes

de s quence/communication

Etc.

10

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Contexte dune contrainte OCL

Une contrainte OCL est toujours associ e un l ment dun

mod le, il est appel le contexte de la contrainte.

Exemple :

context Compte : l'expression OCL s'applique la classe Compte, c'est- -dire

toutes les instances de cette classe

toutes les instances de cette classe

. permet d'acc der une caract ristique d'un objet (m thode,

attribut, terminaison d'association)

Exemple : banque.clients donne lensemble dobjets de type client

associ une banque

11

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Retour lExemple

Exprimer le fait que le solde dun compte

doit tre positif ne peut pas tre fait avec

UML mais peut tre formalis avec la

contrainte OCL suivante :

Context Compte

Inv: solde>0

Exprimer le fait que les clients de la banque

associ e un compte doivent contenir le

propri taire du compte avec OCL:

Context Compte

Inv: banque.clients -> includes (propri taire)

12

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pr et post conditions

Pour sp cifier une op ration

Pr condition : tat qui doit tre respect avant l'appel de l'op ration

Postcondition : tat qui doit tre respect apr s l'appel de l'op ration

Mots-cl s : pre et post

Dans la postcondition, deux l ments particuliers sont utilisables

Dans la postcondition, deux l ments particuliers sont utilisables

Attribut result : r f rence la valeur retourn e par l'op ration

mon_attribut@ pre : r f rence la valeur de mon_attribut avant l'appel de

l'op ration

Syntaxe pour pr ciser l'op ration

context ma_classe::mon_op(liste_param) : type_retour

13

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Pr et post conditions

Exemple1

context Compte::d biter(somme : Integer)

pre: somme > 0

post: solde = solde@pre somme

La somme d biter doit tre positive pour que l'appel de l'op ration soit valide

Apr s l'ex cution de l'op ration, l'attribut solde doit avoir pour valeur la diff rence de sa valeur

Apr s l'ex cution de l'op ration, l'attribut solde doit avoir pour valeur la diff rence de sa valeur

avant l'appel et de la somme pass e en param tre

avant l'appel et de la somme pass e en param tre

Exemple2

context Compte::getSolde() : Integer

post: result = solde

Le r sulat retourn doit tre le solde courant

Attention! On ne d crit pas comment l'op ration est r alis e mais des contraintes sur l' tat

avant et apr s son ex cution

14

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Conception par contrat pour op rations

Pre et postconditions permettent de faire une conception par

contrat

Contrat pass entre l'appelant d'une op ration et l'appel (celui qui

ex cute l'op ration)

Si l'appelant respecte les contraintes de la pr condition alors l'appel

Si l'appelant respecte les contraintes de la pr condition alors l'appel

s'engage respecter la post-condition

Si l'appelant ne respecte pas la pr condition, alors le r sultat de

l'appel est ind fini

Pour exemple pr c dent: Si l'appelant de l'op ration d biter passe une somme

positive en param tre, alors le compte est bien d bit de cette somme

15

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Invariant

Un invariant exprime une contrainte sur un objet ou un groupe

d'objets qui doit tre respect e en permanence

Mot-cl : inv

Exemple: context Compte inv: solde > 0

Pour toutes les instances de la classe Compte, l'attribut solde doit

toujours tre positif

16

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Acc s aux objets, navigation

Dans une contrainte OCL associ e un objet, on peut

Acc der l' tat interne de cet objet (ses attributs)

Naviguer dans le diagramme : acc der de mani re transitive tous les objets

(et leur tat) avec qui il est en relation

Nommage des l ments

Pour les attributs ou param tres d'une op ration, on utilise le nom

Pour les attributs ou param tres d'une op ration, on utilise le nom

directement

Pour le(s) objet(s) en association, on utilise le nom du r le d'association du

Advertisement

c t de cette classe (dans les exemples, sil ny a pas de noms de r les, je

vais utiliser le nom en minuscule de la classe (comme OCL 2.2))

Si cardinalit de 1 ou 0..1 pour une association : r f rence un objet

Si cardinalit > 1 : r f rence une collection d'objets

17

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Acc s aux objets, navigation

Exemples, dans le contexte de la classe Compte

solde : attribut r f renc directement

banque : objet de la classe Banque (r f rence via le nom de la classe) associ

au compte

propri taire : objet de la classe Personne (r f rence via le nom de r le

d'association) associ e au compte

d'association) associ e au compte

banque.clients : ensemble des clients de la banque associ e au compte

(r f rence par transitivit )

banque.clients.age : ensemble des ges de tous les clients de la banque

associ e au compte

Le propri taire d'un compte doit avoir plus de 18 ans

context Compte inv: propri taire.age >= 18

18

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Navigation vers une classe association

Dans contexte Entreprise

Self.Contrat

Dans contexte Personne

Self.Contrat

Comment naviguer vers lobjet Encadrement de son responsable ?

o

self.Encadrement

Comment naviguer vers lobjet Encadrement de son agentSecr tariat ?

o

self.Encadrement

19

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur objets et collections

OCL propose un ensemble de primitives utilisables sur les collections

size() : retourne le nombre d' l ments de la collection

isEmpty() : retourne vrai si la collection est vide

notEmpty() : retourne vrai si la collection n'est pas vide

includes(obj) : vrai si la collection inclut l'objet obj

excludes(obj) : vrai si la collection n'inclut pas l'objet obj

including(obj) : la collection r f renc e doit tre cette collection en incluant l'objet

including(obj) : la collection r f renc e doit tre cette collection en incluant l'objet

obj

excluding(obj) : idem mais en excluant l'objet obj

includesAll(ens) : la collection contient tous les l ments de la collection ens

excludesAll(ens) : la collection ne contient aucun des l ments de la collection ens

Sum(): addition de tous les l ments de la collection

count(obj) : retourne le nombre d'occurences d'un objet dans la collection

Syntaxe d'utilisation : objetOuCollection -> primitive

self: pseudo-attribut r f ren ant l'objet courant

20

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur objets et collections

Exemples, invariants dans le contexte de la classe Compte

propri taire -> notEmpty() : il y a au moins un objet Personne

associ un compte

propri taire -> size() = 1 : le nombre d'objets Personne associ s

un compte est de 1

un compte est de 1

banque.clients -> size() >= 1 : une banque a au moins un client

banque.clients -> includes(propri taire) : l'ensemble des clients de

la banque associ e au compte contient le propri taire du compte

banque.clients.compte -> includes(self) : le compte appartient

un des clients de sa banque

21

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur objets et collections

Autre exemple

context Banque :: creerCompte(p : Personne) : Compte

post: result.oclIsNew() and compte = compte@pre ->

including(result) and p.compte = p.compte@pre -> including(result) and

result.proprietaire = p and result.banque = self

Un nouveau compte est cr . La banque doit g rer ce nouveau compte.

Un nouveau compte est cr . La banque doit g rer ce nouveau compte.

Le client pass en param tre doit poss der ce compte. Le nouveau compte

est retourn par l'op ration.

OclIsNew()

Primitive indiquant qu'un objet doit tre cr pendant l'appel de l'op ration

( utiliser dans une postcondition)

22

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Relations ensemblistes entre collections

union: retourne l'union de deux collections

intersection: retourne l'intersection de deux collections

Exemples

(col1 -> intersection(col2)) -> isEmpty() renvoie vrai si les collections

(col1 -> intersection(col2)) -> isEmpty() renvoie vrai si les collections

col1 et col2 n'ont pas d' l ment en commun

col1 = col2 -> union(col3) La collection col1 doit tre l'union des l ments

de col2 et de col3

23

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur les l ments d'une collection

OCL permet de v rifier des contraintes sur chaque l ment d'une collection

ou de d finir une sous-collection partir d'une collection en fonction de

certaines contraintes

Primitives offrant ces services et s'appliquant sur une collection col

select : retourne le sous-ensemble de la collection col dont les l ments respectent

la contrainte sp cifi e

reject : idem mais ne garde que les l ments ne respectant pas la contrainte

reject : idem mais ne garde que les l ments ne respectant pas la contrainte

collect : retourne une collection (de taille identique) construite partir des

l ments de col. Le type des l ments contenus dans la nouvelle collection peut

Advertisement

tre diff rent de celui des l ments de col.

exists : retourne vrai si au moins un l ment de col respecte la contrainte sp cifi e

et faux sinon

forAll : retourne vrai si tous les l ments de col respectent la contrainte sp cifi e

(pouvant impliquer la fois plusieurs l ments de la collection)

24

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur les l ments d'une collection

Syntaxe de ces op rations : 3 usages

collection -> primitive( expression )

La primitive s'applique aux l ments de la collection et pour chacun d'entre

eux, l'expression expression est v rifi e. On acc de aux attributs/relations

d'un l ment directement.

collection -> primitive( elt : type | expression)

On fait explicitement appara tre le type des l ments de la collection (ici

type). On acc de aux attributs/relations de l' l ment courant en utilisant elt

(c'est la r f rence sur l' l ment courant)

collection -> primitive(elt | expression)

On nomme l'attribut courant (elt) mais sans pr ciser son type

25

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur les l ments d'une collection

Exemples dans le contexte de la classe Banque:

compte -> select( c | c.solde > 1000) Retourne une collection

contenant tous les comptes bancaires dont le solde est sup rieur 1000

compte -> reject( solde > 1000) Retourne une collection contenant

tous les comptes bancaires dont le solde n'est pas sup rieur 1000

compte -> collect( c : Compte | c.solde) Retourne une collection

compte -> collect( c : Compte | c.solde) Retourne une collection

contenant l'ensemble des soldes de tous les comptes

(compte -> select( solde > 1000 )) -> collect( c | c.solde)

Retourne une collection contenant tous les soldes des comptes dont le solde

est sup rieur 1000

inv: not( clients -> exists (age < 18) )

Il n'existe pas de clients de la banque dont l'age est inf rieur 18 ans

not Prend la n gation d'une expression

26

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Op rations sur les l ments d'une collection

Autre Exemple:

context Personne inv: Personne.allInstances() ->

forAll(p1, p2 | p1 <> p2 implies p1.nom <> p2.nom)

Il n'existe pas deux instances de la classe Personne pour lesquelles

l'attribut nom a la m me valeur : deux personnes diff rentes ont un

l'attribut nom a la m me valeur : deux personnes diff rentes ont un

nom diff rent

AllInstances()

Primitive s'appliquant sur une classe (et non pas un objet) et

retournant toutes les instances de la classe r f renc e (ici la classe

Personne)

27

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Types OCL : types de base

Exemples

context Personne inv:

if age < 18 -- v rifie age de la personne

then compte -> isEmpty() -- pas majeur : pas de compte

else compte -> notEmpty() -- majeur : doit avoir au moins un compte

Endif

context Personne inv: compte -> notEmpty() implies banque -> notEmpty()

-- Si une personne poss de au moins un compte bancaire, alors elle est cliente d'au

moins une banque

28

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Enum ration

Utilisation d'une valeur d'une num ration

NomEnum::valeur

Exemples:

context Homme

context Homme

inv: sexe = Gender::male

context Femme

inv: sexe = Gender::female

29

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Propri t s pr d finies en OCL

Pour objets

oclIsTypeOf(type) : l'objet est du type type

oclIsKindOf(type) : l'objet est du type type ou un de ses sous-types

oclInState( tat) : l'objet est dans l' tat tat

oclInState( tat) : l'objet est dans l' tat tat

oclIsNew() : l'objet est cr pendant l'op ration

oclAsType(type) : l'objet est cast en type type

oclIsUndefined() : la propri t (association par exemple) n'a pas

t initialis e ( quivalent d'un null )

30

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

R gles de pr c dence

Ordre de pr c dence pour les op rateurs/primitives du plus au moins prioritaire

@pre

. et ->

not et -

* et /

+ et -

+ et -

if then else endif

>, <, <= et >=

= et <>

and, or et xor

implies

Parenth ses permettent de changer cet ordre

31

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Variables

Advertisement

Pour faciliter l'utilisation de certains attributs ou calculs de valeurs on peut

d finir des variables

Dans une contrainte OCL : let ... in ...

context Personne

inv: let argent = compte.solde -> sum() in age >= 18 implies argent > 0

Une personne majeure doit avoir de l'argent

Pour l'utiliser partout : def

context Personne

def: argent : Integer = compte.solde -> sum()

context Personne

inv: age >= 18 implies argent > 0

32

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

OCL: Bilan

Permet dexprimer des contraintes suppl mentaires quil nest pas

possible dexprimer avec UML

Langage formel mais simple utiliser, non ambigu, grammaire pr cise

Langage d claratif : les contraintes ne sont pas op rationnelles.

Une expression OCL d crit une contrainte respecter et non pas un code

Une expression OCL d crit une contrainte respecter et non pas un code

ex cuter

Langage sans effet de bord : les instances ne sont pas modifi es par

les contraintes.

Peut tre utilis au niveau M3 (sur Ecore, MOF, UML), M2(sur UML et

sur les m ta-mod les MOF et Ecore), M1 (diagrammes UML classe,

tat, etc.)

33

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Exercices

Exercices

34

Exercice1

Ajoutez un attribut m re de type Personne

dans la classe Personne.

Ecrivez une contrainte pr cisant que la m re

d'une personne ne peut tre cette personne

elle-m me et que l' ge de la m re doit tre

elle-m me et que l' ge de la m re doit tre

sup rieur celui de la personne

Solution:

context Personne inv:

self.mere <> self and self.mere.age > self.age

35

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Exercice2

Indiquez quune personne mari e est forc ment majeur

Solution: context Personne inv: mari implies majeur

Trouvez une version plus compacte de lexpression suivante

context Personne inv :

if age >=18 then majeur=vrai

else majeur=faux endif

Solution: context Personne inv: majeur = age >= 18

36

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Exercice3

Les deux contraintes suivantes sont-elles quivalentes ?

Contexte C1 inv: c2->forAll(c:C2| c.c3->notEmpty() implies c.attr2=c.c3.attr3)

Contexte C2 inv: C2.allInstances()->forAll(c:C2| | c.c3->notEmpty() implies

c.attr2=c.c3.attr3)

Solution

NON : la premi re dit que pour des instances de C2 et C3 li es avec une instance de

C1, les attributs attr2 et attr3 sont gaux, mais n'impose rien des instances de C2

et C3 non li es une instance de C1 (et il y en a cause de la multiplicit ).

La deuxi me dit que pour tout couple d'instances de C2 et C3 li es, ces deux

attributs sont gaux.

37

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Exercice4

Exprimer en OCL les contraintes suivantes:

1.

2.

3.

4.

38

Dans une compagnie, un manager doit travailler et avoir plus de 40 ans. Le nombre

d'employ d'une compagnie est non nul

Une personne consid r e comme au ch mage ne doit pas avoir de salaires et une

personne qui travaille doit avoir au moins un revenu de 500 DT par mois.

Dans le contexte de la classe Job: l ge de lemploy doit tre sup rieur 21.

Tous les enfants d'une personne ont bien cette personne comme parent et

inversement

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017

Exercice4

1. context Company

inv: self.manager.isUnemployed = false and self.manager.age > 40 and

self.job -> notEmpty()

2. context Person

Inv: let money : Real = self.job.salary->sum() in

if isUnemployed then money =0 else money >= 500

Endif

Endif

Ou bien

context Person inv:

if isUnemployed=true then self.job ->isEmpty() else self.job.salary->sum()

>= 500

3. context Job inv: self.employee.age > 21

4. context Person inv: children -> notEmpty() implies children -> forAll ( p :

Person |p.parents -> includes(self))

context Person inv: parents -> forAll ( p : Person |p.children -> includes (self))

39

R.DRIRA ENSI-II3 ILSI Chapitre4: OCL

2016-2017