150. Contraintes OCL - Object Constraint Language. Table des matières

Documents pareils
Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

OCL - Object Constraint Language

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Object Constraint Language (OCL)

Ingénierie des Modèles. Méta-modélisation

Object Constraint Language (OCL) Une introduction

IFT2255 : Génie logiciel

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Développement d un interpréteur OCL pour une machine virtuelle UML.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

LE PROBLEME DU PLUS COURT CHEMIN

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

UML Diagramme de communication (communication diagram) Emmanuel Pichon 2013

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Les diagrammes de modélisation

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Cours de Génie Logiciel

Sommaire. G. Pujolle, F. Ravat, C. Soulé-Dupuy, G. Zurfluh

UML. Diagrammes de classes (suite) Delphine Longuet.

Chapitre I : le langage UML et le processus unifié

4. SERVICES WEB REST 46

MODELISATION UN ATELIER DE MODELISATION «RATIONAL ROSE»

Monitor LRD. Table des matières

Université de Bangui. Modélisons en UML

Bases de Données. Plan

CREATION WEB DYNAMIQUE

Sage CRM. Sage CRM 7.3 Guide du portable

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Bases de données. Chapitre 1. Introduction

Langage SQL : créer et interroger une base

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Initiation à la programmation en Python

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

AGRÉGATION «ÉCONOMIE ET GESTION»

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Mineure Architectures Orientées Services SOA Business Process Modeling (BPM) Mineure SOA. Business Process Modeling (BPM)

UML et les Bases de Données

APIs de table pour SQL Server

Java Licence Professionnelle CISII,

Chapitre 1 : Introduction aux bases de données

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Cours Informatique Master STEP

Formation : Modélisation avec UML 2.0 et Mise en pratique

I. Programmation I. 1 Ecrire un programme en Scilab traduisant l organigramme montré ci-après (on pourra utiliser les annexes):

Service d'installation et de démarrage de la solution de stockage réseau HP StoreEasy 1000/3000

Manuel d'utilisation Force.com

MEGA ITSM Accelerator. Guide de Démarrage

Méthodologies de développement de logiciels de gestion

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

OMGL6 Dossier de Spécifications

OpenPaaS Le réseau social d'entreprise

Business Process Modeling (BPM)

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Cours Composant 2. Qualité logicielle et spécications algébriques

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU


Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Paginer les données côté serveur, mettre en cache côté client

Chapitre VI- La validation de la composition.

Rappel sur les bases de données

Par : Abdel YEZZA, Ph.D. Date : avril 2011 / mise à jour oct (ajout de la section 3 et augmentation de la section 1)

DSL. Domain Specific Language. À l'aide des technologies Eclipse Modeling. Goulwen Le Fur Le 23 novembre 2012

Table des matières Sources

I. Introduction aux fonctions : les fonctions standards

WEB page builder and server for SCADA applications usable from a WEB navigator

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

v7.1 SP2 Guide des Nouveautés

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Diagramme de classes

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

MODE OPERATOIRE OPENOFFICE BASE

Evolution et architecture des systèmes d'information, de l'internet. Impact sur les IDS. IDS2014, Nailloux 26-28/05/2014

7.0 Guide de la solution Portable sans fil

Université Paris XI Faculté des sciences d Orsay THÈSE. présentée pour l obtention du grade de Docteur en Sciences de l Université Paris-Sud XI Orsay

Refonte front-office / back-office - Architecture & Conception -

INTRODUCTION : Données structurées et accès simplifié

Modélisation de Lignes de Produits en UML *

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Le Product Backlog, qu est ce c est?

Gestion de base de données

Organigramme / Algorigramme Dossier élève 1 SI

ACTIVITÉ DE PROGRAMMATION

Compte-rendu de projet de Système de gestion de base de données

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

Modèle conceptuel : diagramme entité-association

Le passé composé. C'est le passé! Tout ça c'est du passé! That's the past! All that's in the past!

UML : Unified Modeling Language

La démarche MDA. Auteur : Projet ACCORD (Assemblage de composants par contrats en environnement ouvert et réparti)*

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Transcription:

Document en travail! Modélisation de logiciels de gestion OCL - Object Constraint Language Table des matières 1 Préambule... 2 2 Positionnement d'ocl... 2 3 Exemple de diagramme de classe... 3 4 Invariant... 4 5 Valeur initiale d'attribut... 5 6 Attribut dérivé... 7 7 Contexte... 9 8 Adressage explicite - self... 9 9 Navigation... 9 9.1 Navigation d'une entité vers un attribut... 10 9.2 Navigation d'une entité vers une extrémité opposée d'association... 10 9.3 Navigation d'une entité vers une entité associative... 10 9.4 Navigation d'une entité vers une entité associative par une association réflexive... 11 9.5 Navigation d'une association vers une extrémité... 11 10 Navigation et cardinalités maximales... 12 11 Collections... 12 11.1 Concept... 12 11.2 Opérations de collections... 13 11.2.1 select() et reject()... 13 11.2.2 collect()... 13 11.2.3 forall()... 14 11.2.4 exists()... 15 11.2.5 closure()... 15 11.2.6 iterate()... 16 11.2.7 Autres opérations... 17 12 Eléments complémentaires... 18 12.1 Remarques... 18 12.2 let - Variable locale... 18 12.3 def - Variable globale... 19 12.4 Structure de test... 19 12.5 allinstance()... 19 13 Bibliographie... 20 14 Webographie... 20 1/20

1 Préambule Dans ce document, nous nous contenterons d'étudier OCL dans la perspective de la modélisation de contraintes au sein de modèles conceptuels de données. Plus particulièrement, nous verrons comment: - spécifier des invariants; - spécifier des valeurs initiales et des attributs dérivés Nous nous limiterons aux aspects qui nous semblent les plus importants et nous prions le lecteur de se référer aux spécifications de l'omg pour plus de détails [OMG-2]. OCL ne permet pas de modifier l'état des occurrences d'entités et d'associations du modèle; OCL est garanti :"sans effet de bord". 2 Positionnement d'ocl OCL-Object Constraint Language est un langage formel de contraintes défini par l'omg 1 en complément à UML. Le langage OCL a comme objectif de permettre au modélisateur de rendre les modèles UML plus riches en ajoutant des spécifications que la sémantique des seuls modèles ne permet pas. [OCL-2 Chapitre 7.1] the Object Constraint Language (OCL), a formal language used to describe expressions on UML models. These expressions typically specify invariant conditions that must hold for the system being modeled or queries over objects described in a model. Note that when the OCL expressions are evaluated, they do not have side effects (i.e., their evaluation cannot alter the state of the corresponding executing system). OCL expressions can be used to specify operations / actions that, when executed, do alter the state of the system. UML modelers can use OCL to specify application-specific constraints in their models. UML modelers can also use OCL to specify queries on the UML model, which are completely programming language independent. 1 OMG - Object Mangement Group, http://www.omg.org/ 2/20

3 Exemple de diagramme de classe Le diagramme ci-dessous est repris tel quel du document [OMG-2]; nous l'utiliserons pour les exemples que nous n'avons pas reproduits. Figure 1 - Exemple de diagramme de classes [Copié de OMG-2] 3/20

4 Invariant Un invariant est une expression OCL qui doit être vraie quel que soit l'état des occurrences d'entités et d'associations du modèle. La syntaxe basique de création d'un invariant est de la forme: context TypeName inv simplename: expressionocl - context est un mot réservé - TypeName est l'élément de modélisation (contexte) sur lequel s'applique l'invariant - inv est le mot réservé pour un invariant - simplename est un nom optionnelle qui peut être donné à la contrainte d'invariance - expressionocl est le corps de la contrainte d'invariance qui doit être toujours vraie. A partir du modèle de la Figure 2, nous pourrions écrire l'invariant suivant: context LivreEnfant inv IntervalleAge: agemin <= agemax Quelques règles de mise en œuvre d'invariants, à partir des outils de modélisation graphiques UML: Les invariants sont posés dans des notes. La note est stéréotypée «OCL». Si la note est rattachée à un élément de modélisation, le contexte de la contrainte est implicitement le-dit élément de modélisation et peut donc être omis. Figure 2 - Exemple d'invariants De notre côté, nous avons choisi d'imposer un nom à tout invariant. 4/20

5 Valeur initiale d'attribut Une valeur initiale est définie par une expression OCL. La syntaxe basique d'affectation de valeur initiale à un attribut est de la forme: context TypeName::attributeName Type init: expressionocl - context est un mot réservé - TypeName est l'élément de modélisation (contexte) sur lequel s'applique la valeur par défaut - attributename est le nom de l'attribut à traiter - Type est le type de données de l'attribut traité - init est le mot réservé pour une initialisation - expressionocl est le code d'initialisation A partir du modèle de la Figure 3, nous pourrions écrire l'initialisation suivante: context LigneTicket::rabais int init: 0 Figure 3 - Exemple de valeurs initiales d'attribut En nous appuyant sur l'un ou l'autre outil de modélisation UML, la spécification de valeur initiale d'attribut est beaucoup plus aisée que la description formelle ci-dessus; en général, les outils proposent une propriété de valeur initiale, Initial value, comme dans l'exemple Visual Paradigm ci-dessous: 5/20

Figure 4 - Interface Visual Paradigm d'édition d'un attribut (1) A propos de la valeur initiale de l'attribut dateemission de l'entité Ticket: L'opération d'initialisation, cejour(), est une procédure fournie par l'interface IDates du composant Util selon le modèle ci-dessous. Ce modèle est purement illustratif, il nous faut encore valider les choix de modélisation de ressources externes tels que ce composant Util. Figure 5 - Services du composant Util 6/20

6 Attribut dérivé Un attribut dérivé est défini par une expression OCL. Dans le cadre de ce cours de modélisation des données, un attribut dérivé est un attribut dont la valeur est calculée automatiquement chaque fois qu'il est invoqué. En UML un attribut dérivé est noté avec la barre de division / devant son nom. La syntaxe basique d'affectation de valeur dérivée à un attribut est de la forme: context TypeName::attributeName Type derive: expressionocl - context est un mot réservé - TypeName est l'élément de modélisation (contexte) sur lequel s'applique la dérivation - attributename est le nom de l'attribut à traiter - Type est le type de données de l'attribut traité - derive est le mot réservé pour une dérivation - expressionocl est le code de dérivation. A partir du modèle de la Figure 6, nous pourrions écrire la dérivation suivante: context LigneTicket::montantLigne decimal derive: vendu.prix*quantite Figure 6 - Exemple d'attributs dérivés 7/20

En général, les outils de modélisation UML permettent de définir un attribut comme étant dérivé; nous voyons, dans le formulaire ci-dessous, la propriété Derived qu'il faut valider et compléter avec l'expression de dérivation qu'il suffit de mettre dans la propriété Initial value. Figure 7 - Interface Visual Paradigm d'édition d'un attribut (2) 8/20

7 Contexte En général, le contexte d'application d'une expression OCL est souvent implicite, ce peut être par l'ancrage de la note «OCL» à un objet de modélisation ou par l'écriture de l'expression OCL directement au sein de l'élément auquel elle s'applique. Toutefois, lorsque cela n'est pas possible ou souhaitable, il est tout à fait possible de mettre les contraintes OCL au sein de notes flottantes et de définir le contexte comme illustré en Figure 8. Figure 8 - Déclaration explicite du contexte 8 Adressage explicite - self Implicitement, toute expression OCL s'applique à l'élément de modélisation contextuel; toutefois, il est possible de le spécifier expressément en recourant au mot-clé self. Par rapport au modèle de la Figure 2: context LivreEnfant inv IntervalleAge: agemin <= agemax est équivalent à context LivreEnfant inv IntervalleAge: self.agemin <= self.agemax Remarque: Le recours à l'adressage explicite est particulièrement utile dans le corps d'opérations 2 comparant l'élément de contexte à l'ensemble des éléments de son conteneur [Voir chapitre 11.2.6] 9 Navigation Le symbole d'indirection, le point, sert d'opérateur de navigation. La navigation s'entend: 1. d'une entité vers un attribut 2. d'une entité vers une extrémité opposée d'association 3. d'une entité vers une entité associative 4. d'une entité vers une entité associative par une association récursive 5. d'une association vers une extrémité 2 Des opérations utilisant un ou plusieurs itérateurs comme iterate() ou forall(). 9/20

9.1 Navigation d'une entité vers un attribut Par rapport au modèle de la Figure 2, self réfère à l'entité contextuelle, en l'occurrence LivreEnfant, et.agemin accède à l'attribut agemin context LivreEnfant inv IntervalleAge: self.agemin <= self.agemax Rappel: self. peut être omis. 9.2 Navigation d'une entité vers une extrémité opposée d'association Par rapport au modèle de la Figure 6, self réfère à l'entité contextuelle, en l'occurrence LigneTicket, et.vendu accède à l'entité Produit par l'extrémité vendu de l'association; ensuite,.prix accède à l'attribut prix. context LigneTicket::montantLigne decimal derive: self.vendu.prix*self.quantite Rappel: self. peut être omis. 9.3 Navigation d'une entité vers une entité associative La navigation se fait en référant l'entité associative comme illustré ci-dessous pour l'attribut dérivé tauxpresence. Figure 9 - Navigation vers une entité associative Rappel: Presence.taux est équivalent à self.presence.taux où self est l'entité contextuelle Enfant. 10/20

9.4 Navigation d'une entité vers une entité associative par une association réflexive La navigation se fait en référant l'entité associative et le rôle de départ de la navigation mis entre crochet [] comme illustré ci-dessus pour l'attribut dérivé qteparties. Figure 10 - Navigation vers une entité associative par une association réflexive Rappel: Composition[composite].qte est équivalent à self. Composition[composite].qte où self est l'entité contextuelle Produit. 9.5 Navigation d'une association vers une extrémité Le principe est le même que depuis une entité vers une extrémité opposée [Chapitre 9.2]. Figure 11 - Navigation d'une association vers une extrémité 11/20

10 Navigation et cardinalités maximales Lors de la navigation vers une extrémité d'association, le résultat obtenu sera potentiellement: - Une occurrence de l'entité adossée à l'extrémité lorsque la cardinalité maximale est à 1 - Une collection d'occurrences de l'entité adossée à l'extrémité lorsque la cardinalité maximale est à n. Lorsque la cardinalité maximale est à 1, OCL permet de spécifier le résultat en tant que: - occurrence d'entité ou attribut. - collection composée d'une seule occurrence ou d'un seul attribut. Le choix entre les deux possibilités se marque par l'opérateur -> qui indique que l'élément qui le précède est une collection; l'opérateur -> est toujours suivi d'une opération applicable à la collection. Dans l'exemple de la Figure 12, nous utilisons le marqueur de collection '->' pour vérifier la présence d'une éducatrice responsable et ensuite le marqueur d'indirection '.' pour accéder à l'identifiant naturel, mnemonique, de l'éducatrice responsable. Figure 12 - Exemple de marqueur '.' ou '->' 11 Collections 11.1 Concept Une collection est un ensemble d'éléments de même nature. Un ensemble peut être créé par une expression OCL ou provenir de la navigation. Set {8, 5, 6, 10} context Ticket self.partiede Ensemble créé par une requête OCL. Ensemble des lignes du ticket contextuel. [Voir Figure 6] 12/20

Il existe 4 types de collections: - Set; un ensemble d'éléments uniques; {8,5,6,10} - OrderedSet; un ensemble d'éléments uniques ordonnés; {5,6,8,10} - Bag; un ensemble d'éléments qui peuvent être répétés; {8,5,8,8,6,5,10} - Sequence; un ensemble d'éléments ordonnés qui peuvent être répétés; {5,5,6,8,8,8,10} 11.2 Opérations de collections 11.2.1 select() et reject() Les opérations select (boolean-expression) et reject (boolean-expression) permettent de retourner un sous-ensemble d'une collection initiale. Les exemples ci-dessous s'appliquent à la Figure 6: context Ticket self.partiede->select (rabais > 10) context Ticket self.partiede->reject (rabais > 10) Sélectionne les lignes de ticket portant un rabais > 10% Rejette les lignes de ticket portant un rabais > 10% 11.2.2 collect() L'opération collect (expression) permet de créer une collection à partir d'un ou plusieurs ensembles. Les exemples ci-dessous s'appliquent à la Figure 6: context Ticket self.partiede->collect (rabais) Rend une collection, Bag, constituée de l'ensemble des rabais appliqués au ticket. L'opération collect() est particulièrement intéressante lorsqu'elle est couplée à des opérations ensembliste; dans l'exemple ci-dessous, l'opération asset() rend un ensemble de rabais uniques. context Ticket self.partiede->collect (rabais)->asset() Toutefois, dans un souci de concision, l'appel à la fonction collect() peut être occultée comme ci-dessous: context Ticket self.partiede.rabais 13/20

11.2.3 forall() 11.2.3.1 forall(boolean-expression) L'opération forall(boolean-expression) permet d'appliquer une contrainte à une collection. Cette opération est intéressante pour poser des invariants sur une entité enfant d'une autre entité. L'exemple ci-dessous, s'applique à la Figure 13. context Tache inv employescompetents: self.collabore->forall( maitrisedifficulte >= self.difficulte) Assume que les employés qui collaborent à une tâche ont une maitrise au moins égale à la difficulté de la tâche. Figure 13 - Exemple d'opération forall(boolean-expression) Remarque: La contrainte employescompetents posée sur l'entité Tache est pertinente dans la perspective d'un changement de valeur de l'attribut difficulte. La contrainte employecompetent posée sur l'association est pertinente lors de l'ajout d'un nouvel employé à une tâche. Dans une perspective, d'analyse sémantique très poussée, une seule contrainte pourrait être décrite et l'autre en serait déduite! 14/20

11.2.3.2 forall() avec deux itérateurs L'opération forall, source->forall(iterator1, iterator2; result:boolean result and body ), met en œuvre deux itérateurs qui permettent de faire un produit cartésien réflexif. forall() rend vrai si tous les éléments de la source sont tous différents; autrement, elle rend faux. L'exemple ci-dessous, repris de [OMG-2], s'applique au diagramme de classes de la Figure 1. context Company inv: self.employee->forall(e1, e2:person e1<>e2 implies e1.forename <> e2.forename) Assume que les employés ont des noms différents Remarques à propos de l'exemple ci-dessus: Conformément à nos choix de modélisation [PAS-7], nous mettrions simplement un stéréotype «U» ou plus précisément «UID» à l'attribut forename de la classe Person. Conformément à nos principes de modélisation [PAS-6], nous ne mettrions pas une telle règle, unicité du nom, car elle est manifestement trop restrictive. Remarques générales à propos du produit cartésien réflexif: Dès que le volume de données croit le produit cartésien réflexif est un mécanisme source de surcharge en effet, si la classe ou l'entité contient 10'000 enregistrements, le produit cartésien donne 100'000'000 couples! Dans le cadre d'une vérification d'intégrité lors d'une transaction, nous bannissons cette opération. Par contre, le produit cartésien nous semble envisageable au sein d'une opération de contrôle de qualité pour autant que le système ne soit pas exagérément surchargé. Le problème de la vérification lors de l'ajout ou de la modification d'un enregistrement par rapport aux autres enregistrements de la table reste et doit être résolu; nous proposons de le faire en comparant l'enregistrement en cours de traitement avec l'ensemble des autres enregistrements, ceci peut se faire explicitement avec l'opération iterate() ou implicitement avec le recours à l'opération select(). Au chapitre 11.2.6, iterate(), nous présentons un exemple de validation d'un enregistrement parmi l'ensemble des enregistrements de la même entité. 11.2.4 exists() L'opération exists(boolean-expression) rend vrai si la collection contient au moins un élément satisfaisant la condition booléenne passée en paramètre. 11.2.5 closure() L'opération closure(expression) permet de parcourir une associative réflexive en profondeur. La collection rendue contiendra tous les éléments depuis le premier niveau jusqu'au dernier; la collection de retour est un Set ou un OrderedSet. 15/20

L'exemple ci-dessous, s'applique à la Figure 12. context Educatrice def: lessubordonnees Set(Educatrice) = self.subordonneea.closure( responsable) Déclare et rend une collection des subordonnées de l'éducatrice contextuelle, les subordonnées des subordonnées et ainsi de suite. 11.2.6 iterate() L'opération iterate(iterator, result body) permet de parcourir une collection et de produire un résultat qui est un autre ensemble ou une valeur scalaire (nombre, chaîne, booléen ). Toutes les opérations que nous venons de découvrir sont des enrichissements de iterate(); elle est surtout utile pour créer de nouvelles opérations et/ou mettre en place un translateur 3 entre OCL et un langage exécutable. Figure 14 - Exemple d'opération iterate() L'exemple Figure 14 est repris de notre article traitant des tables Oracle en mutation [PAS- -10]; nous invitons le lecteur à lire le descriptif du cas pratique de cet article qui fixe les règles métier de gestion des utilisateurs. De manière très succincte, la contrainte identunique vérifie que pour tout ajout d'utilisateur ou de modification des données d'un utilisateur: Il n'y ait pas d'autre(s) utilisateur(s) de même identifiant sans date de fin ou avec une date de fin >= à la date de fin de l'utilisateur traité. 3 Dans la vision où, comme nous l'avons déjà écrit, iterate() est la brique de base de toutes les opérations de manipulation des collections. 16/20

Le code de la contrainte d'invariant est écrit à l'inverse de la restriction énoncée ci-dessus; les éléments-clés de notre contrainte sont: Utilisateur.allInstances Récupération de tous les enregistrements de l'entité Utilisateur ->iterate(u:utilisateur ; res: Bag(Utilisateur) = Bag{} (ident = self.ident) and (datefin <> null) and (self.datedebut <= datefin) ->isempty() Parcours itératif de tous les utilisateurs Déclaration de l'itérateur des utilisateurs Déclaration de l'objet résultat de l'itération; en l'occurrence une nouvelle collection d'utilisateurs Condition de redondance ou d'erreurs (le ou les enregistrements existants qui vérifient cette condition sont mis dans la collection de résultat) Invariant vrai si aucun enregistrement n'a été mis dans la collection res:bag(utilisateur) lors de l'itération Notre contrainte peut être décrite avec plus de concision en faisant appel à l'opération select() comme illustré en Figure 15. Figure 15 - Exemple d'opération avec un itérateur implicite 11.2.7 Autres opérations Nous avons présenté quelques opérations significatives, la liste complète est consultable dans [OMG-2] au chapitre 11 - OCL Standard Library. De plus, cette liste fixe aussi le type de collection auquel est applicable chaque opération. A titre d'exemple, nous trouvons: isempty() ou empty() notempty () size() La collection est vide La collection n'est pas vide Le nombre d'éléments dans la collection 17/20

one() sum() La collection contient exactement un élément La collection doit être basée sur des valeurs numériques. Somme des valeurs numériques de la collection. 12 Eléments complémentaires 12.1 Remarques Des remarques peuvent être ajoutées au sein du corps des contraintes. -- ceci est un commentaire sur une ligne expression -- ceci est un commentaire sur une fin de ligne /* ceci est un début de commentaire et cela la fin */ 12.2 let - Variable locale Des variables "locales" peuvent être déclarées directement au sein des expresssions OCL, à l'aide des mots réservés let... in. L'exemple ci-dessous, s'applique à la Figure 6. context LigneTicket inv valeurrabais: let leprix = vendu.prix in if leprix <= 100 then rabais <= 10 else if leprix <= 500 then rabais <= 15 else rabais <= 20 endif endif Vérifie le rabais appliqué en f() du prix du produit vendu. 18/20

12.3 def - Variable globale Des variables "globales à un élément contextuel" peuvent être déclarées à l'aide du mot réservé def comme illustré ci-dessous. Figure 16 - Exemple de déclaration "def" Remarque: now est une variable qui contient la date du jour, c'est une variante à ce que nous avons modélisé en Figure 3; annees() est une fonction qui rend le nombre d'années entre deux dates. 12.4 Structure de test Les mots réservés if, then, else et endif permettent de mettre en place une structure de test. Un exemple en est donné en Figure 12. Remarque: la clause else doit toujours être présente. 12.5 allinstance() allinstance est une opération applicable à une entité; elle retourne l'ensemble des occurreces d'une entité. context Educatrice def: volume: integer = Educatrice.allInstance->size() Rend le nombre d'éducatrices dans la variable volume. 19/20

13 Bibliographie [WK-03] [PAS-6] [PAS-7] [PAS-8] [PAS-9] [PAS-10] The Object Constraint Language J. Warmer, A. Kleppe Addison Wesley, 2003 HEG-Arc Modélisation des données - Aspects macroscopiques P.-A. Sunier, 2005/2013 /chapitre_110/mcd_macro.pdf HEG-Arc Modélisation des données - Les contraintes P.-A. Sunier, 2013 /chapitre_150/contraintes.pdf HEG-Arc Bases du langage de modélisation unifié - UML P.-A. Sunier, 2013 /BachelorII/Modelisation/UML/UML_Bases.pdf HEG-Arc Langage de modélisation unifié - UML P.-A. Sunier, 2013 /BachelorII/Modelisation/UML/UML.pdf Bases de données Oracle Résolution de l'erreur ORA-04091 / Table en mutation P.-A. Sunier, 2009 /publications/soug/bd/articletablemutation.pdf 14 Webographie [I-3] [OCL-1] Wikipédia - Object Constraint Language http://fr.wikipedia.org/wiki/object_constraint_language OMG - Object Constraint Language http://www.omg.org/spec/ocl/ [OMG-2] OMG - Spécifications OCL 2.3.1 Norme ISO 19507 - avril 2012 http://www.omg.org/spec/ocl/iso/19507/pdf 20/20