Title: OCL 2'0
1OCL 2.0
- Laurent Henocque
- http//laurent.henocque.free.fr/
- Enseignant Chercheur ESIL/INFO France
- http//laurent.henocque.perso.esil.univmed.fr/
- mis à jour en Novembre 2008
2Licence Creative Commons
- Cette création est mise à disposition selon le
Contrat Paternité-Partage des Conditions
Initiales à l'Identique 2.0 France disponible en
ligne - http//creativecommons.org/licenses/by-sa/2.0/fr/
- ou par courrier postal à Creative Commons, 559
Nathan Abbott Way, Stanford, California 94305,
USA.
3Références Normatives
- OCL
- http//www.omg.org/cgi-bin/doc?ptc/05-06-06
4Document de référence
5Objectifs
- Ce support de cours propose un panorama complet
des constructions OCL présentées dans le document
de référence
6Exemple support
7- Relation d'OCL avec le méta modèle UML
8Self
- Self désigne l'objet courant
9Context
- Le contexte est soit un objet support, soit une
méthode, éventuellement dans le cadre d'un
package spécifique
10Invariants
11Pré et Post conditions
12Package
13Corps d'opération
14Valeurs initiales
15Valeurs dérivées
16 17Types de base
18Opérations sur les types prédéfinis
19Types du modèle UML
- Toute expression OCL est formulée dans le
contexte d'un type défini dans le modèle de
travail
20Enumérations
21Expressions "Let"
22Attributs fictifs
- On peut réutiliser des définitions dans plusieurs
expressions ocl.
23"Type Conformance"
- OCL est un langage typé
- Tout type est conforme avec tous ses supertypes
- La compatibilité de types est transitive
24Compatibilité des types containers
25Expressions invalides
26Cast
- On peut évaluer une expression avec un "downcast"
ou "upcast"
27Règles de précédence
- _at_pre
- déréferencement . and -gt
- expressions unaires not et -
- et /
- et - binaires
- if-then-else-endif
- lt, gt, lt, gt
- , ltgt
- and, or et xor
- implies
28Opérateurs infixes
- Expressions équivalentes
29Mots réservés (1)
- and
- attr
- context
- def
- else
- endif
- endpackage
- if
- implies
- in
30Mots réservés (2)
- inv
- let
- not
- oper
- or
- package
- post
- pre
- then
- xor
31Commentaires
32Expressions indéfinies
- Normalement, une expression faisant intervenir un
élément indéfini (par exemple un cast impossible)
est elle-même indéfinie - Il y a des exceptions
- les opérateurs logiques "and", "or", "implies"
- l'expression "if" valide si la branche choisie
est valide - Il y a une opération explicite pour tester si une
expression est valide oclIsUndefined()
33 34Propriétés
- On utilise l'opérateur de déréférencement point
pour atteindre les propriétés - un attribut
- un "associationEnd"
- une opération avecl flag "isQuery" vrai
- une méthode avec le flag "isQuery" vrai
- isQueryvrai signifie que l'opération est un
accesseur pur, sans effet de bord
35Attributs
- Quand un attribut a une multiplicité non unaire,
le résultat du déréférencement est une collection
36Définir les opérations
- On utilise les postconditions, et on peut gérer
le cas des paramètres in/out ("var" pascal)
37Opérations
38Extrémités d'associations
- La valeur d'une extrémité d'association est un
objet si la multiplicité est inférieure à 1, et
une collection sinon.
39Cascades de déréférencement
- On utilise la flèche pour déréférencer les
collections, et le point pour les objets
40Noms de rôles manquants
- On utilise le nom de la classe cible quand le nom
du rôle est absent - On met toutefois la première lettre en minuscules
41Relations 0-1
- On peut leur appliquer les opérations sur les
ensembles
42Test de présence de la cible
- On doit souvent tester si un élément est présent
pour une relation 0-1. On combine les deux
notations
43Former des expressions
- Une entreprise a moins de 50 salariés
- Une personne mariée a plus de 18 ans
44Atteindre les classes d'association
- Exemple difficile d'une "self" relation
45Cas simple
- On peut mentionner le nom du rôle traversé pour
atteindre la classe d'association même dans les
cas simples
46Navigation à partir des classes d'association
- On utilise les noms des rôles
47Associations qualifiées
- On utilise des crochets pour spécifier la clé
- mais cela reste optionnel
48Chemins de packages
49Propriétés surchargées
- On utilise oclAsType(type) pour upcaster un objet
et atteindre des propriétés surchargées par la
classe courante. - Ex B hérite de A
50Exemple d'ambiguïté
51Propriétés prédéfinies
- oclIsTypeOf (t OclType) Boolean
- oclIsKindOf (t OclType) Boolean
- oclInState (s OclState) Boolean
- oclIsNew () Boolean
- oclAsType (t OclType) instance of OclType
52OclIsTypeOf
53OclIsKindOf
- Teste si son argument est un supertype de l'objet
support
54OclInState
- On utilise aussi la notation "" quand la classe
comporte plusieurs statemachines que l'on veut
identifier
55Propriétés des classes
56Littéraux des Collections
- Ensembles
- Séquences
- Bags
57Ranges
58Obtenir les collections
- Par les littéraux,
- Par les rôles
- Par l'utilisation d'opérations à valeurs de
retour adaptées
59Règles de compatibilité pour les collections
- Les types Set(X), Bag(X) et Sequence(X) sont des
sous types de Collection(X) - Collection(Type1) est compatible avec
Collection(Type2), quand Type1 est compatible
avec Type2. - (valable pour Set, Sequence, Bag)
60Valeurs avant l'appel dans les postconditions
- On ajoute _at_pre à la propriété
61_at_pre
- Quand une propriété _at_pre évalue à un objet, ses
propriétés sont celles obtenues à la fin de
l'appel. - Si on veut désigner celles valables avant
l'appel, il faut utiliser _at_pre de nouveau
62Tuples
- Grouper des données arbitrairement
- Ordre et noms de types sont optionnels
63TupleType
64Tuples ...
- On déréférence les tuples comme des expressions
- Ex un manager a le plus haut salaire des
employés qu'il dirige
65Opérations sur les collections
- select
- reject
- collect
- forall
- exists
- iterate
66Select
67Select
- On peut spécifier le type de l'itérateur
68reject
69collect
- Construit un ensemble à partir des propriétés
d'un autre
70Valeur de collect
- Si l'ensemble itéré est un Set, le résultat est
un Bag. On peut en refaire un ensemble avec
"asSet" - Si c'est une séquence ou un ordered set, le
résultat est une séquence
71Raccourci pour collect
72Forall/Exists
73Paramètres formels multiples
- Deux formulations équivalentes
74iterate
- iterate est l'expression de base pour construire
collect etc... - iterate utilise un élément (elem) et un
accumulateur (acc)
75collect avec iterate
76iterate en Java (pour le fun)
77Variables implicites
- On peut omettre des variables, qui sont
substituées par des variables implicites. - En cas d'ambiguïté, une propriété est résolue
dans le bloc de portée la plus proche
78- employer variable implicite selfPerson
- employee variable implicite cCompany
- lastname variable implicite pPerson
- name est une propriété de Company
- lastname est une propriété de Person, donc ici
ambiguë on choisit "p" au lieu de self - self.employer-gt
- forall(cCompanyc.employee-gt
- exists(pPersonp.lastNamec.name))
79 80Appel d'opérations et envoi de signal
- On utilise l'opérateur "hasSent" .
- Ex évalue à vrai si un message a été envoyé Ã
l'observer pendant l'exécution - les paramètres peuvent être indéterminés
81Ensemble des messages
82Valeurs de retour
- On utilise une opération standard sur les
messages "result()" - Disponible même dans le cas asynchrone Ã
condition que l'opération définisse un type de
retour
83Conclusion
- OCL est un langage pour formuler les contraintes
appliquées aux modèles objets - L'utilisation d'OCL permet de spécifier des
aspects des modèles qui ne peuvent être décrits
par les diagrammes seuls