En OCL, on navigue dans le modèle de manière similaire à ce qui se fait en Java : classe.attribut.relation.operation().attribut
etc.
Il est possible de tester si un attribut est non défini avec objet.attribut.oclIsUndefined()
.
Les commentaires mono-ligne sont introduits par --
, les commentaires multi-lignes sont délimités par /*
et */
.
Il est possible d'appeler des méthodes sur les objets, mais pour que la sémantique d'OCL soit respectée, ces opérations ne doivent pas avoir d'effet de bord.
Il est possible de définir des invariants, en donnant le contexte dans lequel ils sont exprimés :
context StateMachine inv oneInitialState: states->select(isInitial)->size = 1
Les opérateurs suivants sont disponibles : implies
, and
, or
, xor
, not
, if _ then _ else _
, >=
, <=
, >
, <
, =
, <>
(differs), +
, -
, /
, *
, a.mod(b)
, a.div(b)
, a.abs()
, a.min(b)
, a.round()
, a.floor()
, s1.concat(s2)
, s.toLower()
, s.toUpper()
, s.substring(start, end)
Quand la navigation dans le modèle mène à plusieurs objets, le résultat est une collection. Les opérations sur les collections, notées avec une flèche ->
, sont les suivantes :
coll->isEmpty()
indique si la collection est videcoll->notEmpty()
indique si la collection n'est pas videcoll->size()
donne la taille de la collection (nombre d'éléments)coll->includes(o)
indique si la collection contient l'élémento
coll->includesAll(c)
indique si la collection contient tous les éléments de la collectionc
coll->union(c)
rend l'union des collectionscoll
etc
coll->intersection(c)
rend l'intersection des collectionscoll
etc
coll->select(v|expr(v))
rend la collection des élémentsv
de la collection pour lesquelsexpr(v)
est vraiecoll->collect(v|expr(v))
rend la collection des valeurs deexpr(v)
pour les élémentsv
de la collectioncoll->exists(v|expr(v))
indique si la collection contient un élémentv
pour lequelexpr(v)
est vraiecoll->forAll(v | expr(v))
est vraie si et seulement siexpr(v)
est vraie pour tout élémentv
de la collection.
Pour éviter de faire plusieurs fois la même requête, il est possible de nommer le résultat d'un expression : let v = expr