Modélisation de système : OCL vous en redemandez ?
Pour spécifier une classe d'association (Job ou Marriage dans le diagramme de classe UML) :
self.Job[employer]
On peut naviguer à partir de la classe d'association vers les objets participants :
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
self.customer[123456789]
Pour spécifier un chemin complet avec des package :
Accédez aux propriétés d'un supertype :
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 :
oclIsKindOf (t : Classifier) : Boolean
oclIsInState (s : OclState) : Boolean
oclIsNew () : Boolean
oclAsType (t : Classifier) : instance de Classifier
inv: self.oclIsTypeOf( Person ) -- = true
inv: self.oclIsTypeOf( Company) -- = false
Membres statiques d'une classe :
Employee::uniqueID()
Si nous voulons que toutes les instances de Personne aient un nom unique :
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 { '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) :
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 :
self.employee->reject( isMarried )->isEmpty()
Pour obtenir des collections différentes (les 3 expressions suivantes sont équivalentes) :
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 :
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 :
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) :
-- 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/
A découvrir aussi
- Modélisation de système : Soyez maniaque, croisez et recroisez vos modèles UML pour être certain qu'ils soient valides (5)
- Modélisation de système : Soyez maniaque, croisez et recroisez vos modèles UML pour être certain qu'ils soient valides (11)
- Modélisation de système : OCL ça se complique !
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 799 autres membres