Modélisation UML & SysML

Expertise et articles Blog sur UML, SysML, et Enterprise Architect de Sparx Systems

english versionTwitterUMLChannel SparxSystems EA YouTube videosLinkedIn
jeudi, 27 mars 2014 13:33

OMG Object Constraint Language OCL 2.4 disponible

Écrit par
Évaluer cet article
(1 Vote)

Les spécifications d'Object Constraint Language (OCL) v. 2.4 ont été publiées sur le site de l'OMG (Object Management Group), remplaçant la précédente version 2.3.1 datée de Janvier 2012. Cette version d'OCL est liée à la version 2.4.1 d'UML.

Les spécifications OCL 2.4 sont disponibles en téléchargement depuis le lien suivant : www.omg.org/spec/OCL/2.4

Quelques rappels sur OCL

OCL est un langage de spécification permettant de décrire et d'exprimer des règles et contraintes sans ambiguïté en s'appuyant sur des modèles UML, principalement au travers de diagrammes de classes et d'état.
OCL s'exprime sous forme de pseudo-code pour définir des contraintes d'invariance dans le modèle, des requêtes sur le modèle, des règles de calcul d’attributs dérivés (ex : Personne.isMarried), des pre/post conditions d'opérations (approche "design by contract"), etc.

Exemple d'invariance sur l'attribut numberOfEmployees de la classe Company, pour définir en OCL qu'une société doit toujours avoir plus de 50 employés :

  • context Company inv:
  • self.numberOfEmployees > 50

Exemple d'expression sur une opération de classe pour obtenir l'épouse actuelle via une requête OCL :

  • context Person::getCurrentSpouse() : Person
  • -- pre condition : la personne doit être mariée
  • pre: self.isMarried = true
  • -- body correspond à une requête OCL : parmi la collection de mariages, obtenir la personne avec laquelle le mariage comporte une date de fin nulle
  • body: self.mariages->select( m | m.ended = false ).spouse

Principaux changements dans OCL 2.4

La version "with change bars" des spécifications de l'OMG pour OCL 2.4 permet de facilement trouver les évolutions et changements dans ce document de spécifications de 262 pages, dont voici une courte sélection.

1. Précisions sur le casting et re-typage de collections d'éléments

  • aCollection->oclAsType(Set(String)) désigne le changement du type de la collection aCollection au type String
  • aCollection->collect(oclAsType(Person)) désigne le changement du type de chaque élément de la collection aCollection à la classe Person

2. Opérateurs de navigation

Pour rappel, les opérateurs de navigation sont :

  • Le point " . " pour naviguer d'un objet sur une propriété ou une opération.
  • Exemples :
    • Propriété "name" de l'objet "anObject" : anObject.name
    • Opération "indexOf()" de l'objet "aString" : aString.indexOf(':')
  • L'opérateur " -> " pour naviguer sur la propriété ou l'opération d'une collection, ou pour effectuer des itérations sur les éléments d'une collection.
  • Exemples :
    • Propriété elementType de la collection aBag : aBag->elementType
    • Opération "collect()" de la collection aSet : aSet->collect(name)

3. Raccourcis de navigation

  • Utilisation du point " . " pour effectuer une collection implicite d'une opération ou propriété sur une collection :
    • aSet.name est l'équivalent de aSet->collect(name)
  • Utilisation de l'opérateur "->" pour effectuer conversion implicite en collection (Set) d'un objet :
    • anObject->union(aSet) est l'équivalent de anObject.oclAsSet()->union(aSet)

Ces raccourcis sont effectivement utiles pour faciliter la lecture de spécifications OCL.

4. Syntaxe OCL pour tester si un objet est dans un état

La syntaxe utilisée pour tester l'état d'un objet est clarifiée parmi les diverses options jusqu'à présent disponibles :

  • oclIsInState (s : OclState) : Boolean
  • Exemples pour tester si un objet est dans un état :
    • object.oclIsInState(On)
    • object.oclIsInState(Off)
    • object.oclIsInState(Off::Standby)
    • object.oclIsInState(Off::NoPower)