CentraleSupélecDépartement informatique
Plateau de Moulon
3 rue Joliot-Curie
F-91192 Gif-sur-Yvette cedex
Memento OCL

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 vide
  • coll->notEmpty() indique si la collection n'est pas vide
  • coll->size() donne la taille de la collection (nombre d'éléments)
  • coll->includes(o) indique si la collection contient l'élément o
  • coll->includesAll(c) indique si la collection contient tous les éléments de la collection c
  • coll->union(c) rend l'union des collections coll et c
  • coll->intersection(c) rend l'intersection des collections coll et c
  • coll->select(v|expr(v)) rend la collection des éléments v de la collection pour lesquels expr(v) est vraie
  • coll->collect(v|expr(v)) rend la collection des valeurs de expr(v) pour les éléments v de la collection
  • coll->exists(v|expr(v)) indique si la collection contient un élément v pour lequel expr(v) est vraie
  • coll->forAll(v | expr(v)) est vraie si et seulement si expr(v) est vraie pour tout élément v 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