Académique Documents
Professionnel Documents
Culture Documents
propriétés prédéfinies
{abstract}, {ordered}, {frozen}, {subset}, {xor}, {addOnly}
S. Mouline 2
Problématique Remarque
paul
:Cl
i
ent c1:Compt
e
t
it
ulai
res
t
it
ulai
res
Lesignat
air
ed'
unecart
ebl
eue
pi
err
e:Cl
i
ent
t
i
c2:Compt
e estt
i
tulai
redececompt
e.
t
ulai
res
t
it
ulai
res
mar
ie:Cl
i
ent c3:Compt
e
si
gnat
air
e
:Car
teBl
eue
t
it
ulai
res
j
ean:Cl
i
ent c2:Compt
e
t
it
ulai
res
S. Mouline 3 S. Mouline 4
Expression des contraintes en langue
naturelle Exemple
Simple à mettre en oeuvre
Compt
e
utilisation des notes en UML + texte libre 1.
.4 0.
.* 1.
.* 1 Banque 1.
.*
Cl
i
ent numér
o numér
o
t
i
tul
air
es
compréhensible par tous sol
de
1 si
gnat
air
e dMax 0.
.*
Indispensable ! 1
Consor
ti
um
documenter les contraintes est essentiel Car
teBl
eue
0.
.* * 1
détecter les problèmes le plus tôt possible code
ret
rai
tMax 0.
.*
Di
st
ri
but
eur
Problèmes * 1.
.*
ambigu, imprécis
difficile d ’exprimer clairement des contraintes
complexes
difficile de lier le texte aux éléments du modèle
S. Mouline 5 S. Mouline 6
S. Mouline 7 S. Mouline 8
Caractéristiques d’OCL Caractéristiques d’OCL
S. Mouline 9 S. Mouline 10
1 inv: solde > -dMax OCL peut également être utilisé pour décrire des expressions
Car
teBl
eue
0.
.* * def: déclarer des attributs ou des opérations def: nbEnfants:Integer
context CarteBleue
c
ode
r
etr
ait
Max
{ inv:
inv: Compte.titulaires->includes(self.signataire)
init: spécifier la valeur initiale des attributs init: enfants->size()
retraitMax < { inv: dMax >= 0
= 2000 } inv: solde > -dMax } inv: code>0 and code<=9999 body: exprimer le corps de méthodes {query} body: enfants-
inv: retraitMax>10 >select(age< a )
nv: Compte.titulaires->includes(self.signataire)
inv: code>0 and code<=9999 context Compte::solde : integer
derive: définir des élements dérivés (/) derive: age<18
inv: retraitMax>10 init: floor(depotInitial * 10 / 100)
S. Mouline 11 S. Mouline 12
Opérations spécifiques au modèle objet
Accès à un attribut - Accès à une méthode
d ’UML
accès à un attribut, à une opération objet . attribut
navigation via les associations Accès à un attribut
VIA une association
self.dateDeNaissance
VERS une classe associative
DEPUIS une classe associative
VIA une association qualifiée objet . méthode( expr1, expr2, … )
accès au type et super types Accès à une méthode sans effet de bord ( {query} )
accès aux instances d’une classe (extension) self.impôts(1998)
accès à l'état d'un objet
constructions pour les post conditions
S. Mouline 13 S. Mouline 14
S. Mouline 15 S. Mouline 16
Navigation VIA une association Navigation VERS une association
S. Mouline 17 S. Mouline 18
chef
s not
e=5
pabl
o e3 paul
paul.Evaluation [chefs ] not
e=5 e1 s.Emploi->select(salaire<1000).employés
paul.Evaluation [employés] not
e=15
chef
s
sophi
e
paul.Evaluation [chefs].note -> sum()/paul.Evaluation [chefs]-
>size()
S. Mouline 19 S. Mouline 20
Navigation via une Association Qualifiée Opérations concernant les types
c4
b.compte[ 0 ]
S. Mouline 21 S. Mouline 22
Personne
Classe.propdeclasse
Contraintes sur les types *
p.enfants->select(oclIsTypeOf(Femme)) nom enfants
Permet d ’accéder aux propriétés de classes
p.enfants->select(oclIsKindOf(Femme)) Personne
*
Cin enfants
Femme Classe.allInstances nom
Accès aux propriétés redéfinies nomDeJF Retourne l ’ensemble des instances de la classe
f . oclAsType(Person).nom
c ’est à dire l ’extension de cette classe
Personne.allInstances->size() < 500
Typage dynamique
Personne.allInstances->forall(p1,p2 |
p.enfants-
>select(oclIsKindOf(Femme)).oclAsType(Set(Femme)) p1<>p2 implies p1.cin <> p2.cin)
->select(nomDeJF <> nom) Personne.allInstances->isUnique(cin)
S. Mouline 23 S. Mouline 24
Invariants (inv) Exemples d’invariants (inv)
ancêtre
Prédicat associé à une classe ou une association Personne
*
Doit être vérifié à tout instant context Personne cin enfants
age
Le contexte est défini par un objet inv : age>0 and self.age<110 nom
cet objet peut être référencé par self Personne
cin
*
enfants
inv mariageLégal : marié implies age > 18 filles *
l ’objet peut être nommé explicitement age
L ’invariant peut être nommé nom inv enfantsOk : enfants->size() > 0 Femme
nomDeJF
context Personne inv : not enfants-> includes(self)
inv mineur : age < 18 inv : enfants->includesAll(filles)
inv : self.age >= 0
S. Mouline 25 S. Mouline 26
S. Mouline 27 S. Mouline 28
Expression du corps d'une méthode (body) Pré-conditions et post-conditions (pre, post)
Description en OCL d'une méthode sans effet de bord ({isQuery}) Prédicats associés à une opération
Equivalent à une requête les pré-conditions doivent être vérifiées avant l ’exécution
les post-conditions sont vraies après l ’exécution
context Personne:acf( p : Personne ) : OrderedSet(Personne)
self désigne l ’objet sur lequel l ’opération à lieu
body : self.ancestres()->intersection(p.ancestres()) Dans une post-condition :
->select(sexe = Sexe::’F’)->sortedBy(dateDeNaissance) @pre permet de faire référence à la valeur avant l ’opération
result designe le resultat
context Personne ocsIsNew() indique si un objet n'existait pas dans l'état précédent
def: ancestres : Set(Personne) context Type::opération( param1 : Type1, …) : Type
pre nom1 : param1 < …
= parents->union(parents.ancestres->asSet())
pre nom2 : …
post nom2 : … result > …
S. Mouline 29 S. Mouline 30
Exemples
Exercices
context Personne::retirer( montant : Integer ) Spécifier une fonction qui retourne la racine carrée d'un réel
pre : montant > 0
context Math::Sqrt(x : Real) : Real
post : solde < solde@pre - montant
pre: x>=0
context Personne::salaire() : integer
post: result * result = x
post : result >= Legislation::salaireMinimum
context Compagnie::embaucheEmployé( p : Personne) : Partie entière de la racine carrée d'un entier
Contrat
context Math::ISqrt( x : Integer ) : Integer
pre pasPrésent : not employés->includes(p)
post embauché : employés = employés@pre->including(p)
pre: x>=0
post : result.oclIsNew() post: result*result <= x and (result+1)*(result+1) > x
post : result.compagnie = self and result.employé = p
S. Mouline 31 S. Mouline 32
Contraintes sur l'état dans les post-conditions
Accès à l'état d'un objet
@pre fait référence à la valeur d'une propriété dans l'état initial
obj . oclInState( state ) result fait référence au résultat
oclIsNew indique que l'objet n'existait pas dans l'état initial
context Compte::virementInterne( dest : Compte, montant :
Indique si l'objet est dans l'état spécifié integer )
Si une machine à état a été associée à la classe de : Opération
pre: montant>0
l'objet
pre: montant<self.solde
:: pour avoir accès aux états imbriqués pre: self.titulaire = dest.titulaire
pre: self.banque = dest.banque
post: self.solde < self.solde@pre - montant
enfants->select( e | e.oclInState( Employé ) ) post: dest.solde = dest.solde@pre + montant
livres->exists( l.oclInState( Rentré::ARanger ) ) post: self.operations = self.operations@pre->append(result)
post: result.oclIsNew and result.montant = montant
S. Mouline 33 S. Mouline 34
context TreeModel::hasChanged()
post: getTreeListeners()@pre->forall( li | li ^ update() )
*
TreeModel TreeView
treeListeners
hasChanged() update()
S. Mouline 35 S. Mouline 36