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://www.urbanisation-si.com/
http://urbanisation-si.blog4ever.net
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/