urbanisation-si

urbanisation-si

Modélisation de système : OCL vous en redemandez ?

modelisation-systeme-tutoriel-OCL-UML-2.png

Pour spécifier une classe d'association (Job ou Marriage dans le diagramme de classe UML) :

context Person inv:
   self.Job[employer]

On peut naviguer à partir de la classe d'association vers les objets participants :

context Job
   inv: self.employer.numberOfEmployees >= 1
   inv: self.employee.age > 21

Naviguez à travers des associations qualifiées : pour obtenir la personne possédant le compte bancaire 123456789

context Bank inv:
   self.customer[123456789]

Pour spécifier un chemin complet avec des package :

Packagename1::Packagename2::Typename

Accédez aux propriétés d'un supertype :

context B inv:
   self.oclAsType(A).p1 -- accède à la propriété p1 définie dans le supertype A (B hérite de A)
   self.p1 -- accède à la propriété p1 définie dans B (B est l'objet courant)

Propriétés prédéfinies pour tous les objets :

oclIsTypeOf (t : Classifier) : Boolean
oclIsKindOf (t : Classifier) : Boolean
oclIsInState (s : OclState) : Boolean
oclIsNew () : Boolean
oclAsType (t : Classifier) : instance de Classifier
context Person
   inv: self.oclIsTypeOf( Person ) -- = true
   inv: self.oclIsTypeOf( Company) -- = false

Membres statiques d'une classe :

context Employee::id : String init:
   Employee::uniqueID()

Si nous voulons que toutes les instances de Personne aient un nom unique :

context Person inv:
   Person.allInstances()->forAll(p1, p2 | p1 <> p2 implies p1.name <> p2.name)

La gestion des collections : Set = pas de doublons ; Bag = doublons possible ; Sequence = Bag ordonné ; OrderedSet = Set ordonné

Ces collections sont définies dans "OCL Standard Library".

Exemples :

Set { 1 , 88, 5, 2 }
Set { 'strawberry', 'apple', 'orange' }
Sequence { 45, 3, 3, 2, 1 }
Sequence { 'ape', 'nut' }
Bag {1, 3, 4, 3, 5 }

Selectionner les personnes qui ont plus de 50 ans (les 2 expressions suivantes sont équivalentes) :

context Company inv:
   self.employee->select(age > 50)->notEmpty()

context Company inv:
   self.employee->select(p | p.age > 50)->notEmpty()

Pour obtenir tous les éléments pour lesquels la condition est fausse (l'inverse du select), exemple, pour avoir les célibataires :

context Company inv:
   self.employee->reject( isMarried )->isEmpty()

Pour obtenir des collections différentes (les 3 expressions suivantes sont équivalentes) :

self.employee->collect( birthDate )
self.employee->collect( person | person.birthDate )
self.employee->collect( person : Person | person.birthDate )

Pour savoir (le résultat sera vrai) si une condition s'applique (est vraie) sur toutes les occurrences :

context Company
   inv: self.employee->forAll( age <= 65 )
   inv: self.employee->forAll( p | p.age <= 65 )
   inv: self.employee->forAll( p : Person | p.age <= 65 )

Pour savoir si une condition s'applique sur au moins une occurrence :

context Company inv:
   self.employee->exists( forename = 'Jack' )
context Company inv:
   self.employee->exists( p | p.forename = 'Jack' )
context Company inv:
   self.employee->exists( p : Person | p.forename = 'Jack' )

Itération (les 2 expressions suivantes sont équivalentes) :

collection->collect(x : T | x.property)
-- est identique à :
collection->iterate(x : T; acc : T2 = Bag{} |
acc->including(x.property))

Nous verrons dans un prochain article la gestion des messages.

 

"Assume ton destin. Derrière les soucis, le chagrin et la peur, tu découvriras alors l'extraordinaire bonheur qu'est la confiance en soi."
Richard Dehmel

 

Voir aussi :  

 

http://urbanisation-si.wix.com/blog

http://urbanisme-si.wix.com/blog

http://urbanisation-si.wix.com/urbanisation-si

http://urbanisation-si.over-blog.com/

http://rhonamaxwel.over-blog.com/

http://urbanisation-des-si.blogspot.fr/

http://bonnes-pratiques-si.eklablog.com/

http://urbanisation-si.eklablog.com/



21/08/2015
0 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 94 autres membres