Les concepts d’UML - Le langage OCL - 2003/2004 Cours d'UML
OCL: what is it? OCL: Object Constraint Language Chapter 6 of UML 1.5 Langage formel pour exprimer les contraintes. Expression des invariants d’un système modélisé. Les expressions OCL sont évaluées, n’ont aucun effet de bord. Celui-ci s’applique non seulement au méta-modèle mais aussi au modèle. 2003/2004 Cours d'UML
Pourquoi OCL? Un diagramme UML peut manquer de précision pour exprimer tous les aspects d’une spécification. Besoin de décrire des contraintes additionnelles au modèle. Le langage naturel est souvent utilisé Pb: apparition d’ambiguïtés. OCL a pour but de combler ce manque! Langage formel aucune ambiguïté Pure langage d’expressionaucun effet de bord Ce n’est pas un langage de programmationne modifie pas le modèle. 2003/2004 Cours d'UML
OCL: Comment l’utiliser Utilisation d’OCL dans plusieurs cas: Spécifier les invariants des classes et types du modèle de classes Spécifier les invariants pour les stéréotypes Décrire les pre et post conditions sur les opérations et méthodes. Décrire les gardes L’utiliser comme langage de navigation Spécifier les contraintes sur les opérations 2003/2004 Cours d'UML
OCL: Comment l’écrire? De manière graphique: De manière textuelle: Contexte Expression OCL Ex: context Compagny inv: self.numberOfEmployees > 50 Entité UML {Règle OCL} 2003/2004 Cours d'UML
Le contexte s’écrit de la manière suivante : OCL: Le contexte (1/2) Le contexte s’écrit de la manière suivante : Context entitéUML typeDecontexte [nomDeLaRègle]: Ex: Context compagny inv: Context c:Compagny inv enoughEmployees: 2003/2004 Cours d'UML
Dans le cas d’un contexte invariant: Context entitéUML inv: Expression OCL Ex: context Compagny inv: self.numberOfEmployees > 50 2003/2004 Cours d'UML
Dans le cas d’un contexte pre et postconditions OCL: Le contexte (2/2) Dans le cas d’un contexte pre et postconditions S’applique aux opérations Context typeName::opérationName(param1: type1, . . .):ReturnType pre : param1>. . . post: result =. . . Ex: Context Person::income(date:Date):Integer post: result = 5000 2003/2004 Cours d'UML
OCL: Écriture d’une expression Type de base: Booléen : Boolean Entier : Integer Réel : Real Chaîne de caractères : String Opération sur les types: Booléen : and, or, xor, not, implies, if-then-else Entier : +, -,*, /, abs(), max()… Réel : +, -,*, /, floor(),max()… Chaîne de caractères : toUpper(), concat(),size()… 2003/2004 Cours d'UML
OCL: Écriture d’une expression Accès au propriété d’un objet: Objet.propriété Accès à un attribut: Ex: context Person inv: self.age > 0 Accès à une opération: Ex : aPerson.income(aDate) 2003/2004 Cours d'UML
OCL: Écriture d’une expression Accès à une fin d’association Objet.nomDuRôleOpposé context Company inv: self.manager.isUnemployed = false inv: self.employee->notEmpty() context Person inv: self.employer->isEmpty() -- Ensemble de personnes qui ont -- le rôle employeur 2003/2004 Cours d'UML
OCL: Écriture d’une expression Navigation vers la classe associations Context Person inv: self.employeeRanking[bosses]->sum() > 0 Ensemble des « employeeRanking » qui appartiennent à la collection « bosses » 2003/2004 Cours d'UML
OCL: Écriture d’une expression Quelques opérateurs Accès aux propriétés des supertypes Context B inv: Self.oclAsType(A).attributeA Self.attributeA Nous avons accès à la propriété définie dans la classe A. Ensuite, nous accédons à la propriété définie dans la classe B. 2003/2004 Cours d'UML
OCL: Écriture d’une expression Les notions d’ensemble: Set C’est un ensemble au sens mathématique, les doublons ne sont pas admis. {1, 5, 4, 8} Bag Cet ensemble accepte plusieurs même éléments, les doublons sont admis. {1, 1, 5, 4, 4, 8} Sequence Cet ensemble peut contenir des doublons et tous ses éléments sont ordonnés. {1, 1, 4, 4, 5, 8} 2003/2004 Cours d'UML
OCL: Écriture d’une expression L’opérateur @pre Celui-ci est utilisé pour spécifier les pre et post-conditions sur les opérations et méthodes dans UML. Il indique la valeur de la propriété au début de l’opération. Il est post fixé Ex: context Person::birthdayHappens() post: age=age@pre + 1 2003/2004 Cours d'UML
OCL: Écriture d’une expression Sélection dans un sous ensemble Collection->select(…) Ex : context Company inv: self.employee->select(age>50)->notEmpty() Rejet d’un élément d’une collection Collection->reject(…) Ex: self.employee->reject(isMarried)->isEmpty() 2003/2004 Cours d'UML
OCL: Écriture d’une expression Existence Collection->exist(…) Ex : context Company inv: self.employee->exists(forename =‘Jack’) Iteration collection->iterate(elem:Type;acc:type=<expression>)| expression-with-elem-and-acc) self.employee->iterate(p:Person;acc=Bag{} |acc->including (p.forename<>’Jack’) 2003/2004 Cours d'UML
OCL : l’expression « let » ‘Let’ permet de définir un attribut ou une opération dans une contrainte Ex: context Person inv: let income: Integer=self.job.salary-> sum() let hasTitle(t: string):Boolean= self.job->exists(title=t) in if isUnemployed then self.income <100 else self.income>=100 and self.hasTitle(‘manager’) endif 2003/2004 Cours d'UML
Manipulation des collections Opérations sur les collections: Collection->size(), Collection->includes(objet), Collection->excludes(objet), Collection->count(objet), Collection->includesAll(collection), Collection->excludesAll(collection), Collection->isEmpty(), Collection->notEmpty(), Collection->sum(), Collection->exist(expressionOCL), Collection->sortedBy(expressionOCL) 2003/2004 Cours d'UML
Opérations sur les collections de type Set et Bag set->union (set2:Set(T)) ou Bag->union(bag2:Bag(T)) = set->intersection(set2:Set(T)) ou set->intersection(bag2:Bag(T)) (set ou bag)->select(expressionOCL (set ou bag)->reject(expressionOCL) (set ou bag)->count(object) 2003/2004 Cours d'UML
Système de gestion pour le prêt d’un livre. Etude de Cas Système de gestion pour le prêt d’un livre. L’étudiant ne peut emprunter que 4 livres au maximum. La durée de l’emprunt dure 3 semaines. Si le livre est rendu N jours en retard, l’étudiant ne peut pas emprunter de livres pendant N jours. … 2003/2004 Cours d'UML
Analyse rapide Déterminons les classes: Les attributs Livre Auteur Étudiant Emprunt Les attributs Livre: titre Étudiant: nom, prénom, age Auteur: nom, prénom Emprunt: dateDébut, DateFin 2003/2004 Cours d'UML
Diagramme de classe 1/2 2003/2004 Cours d'UML
Diagramme de classes 2/2 2003/2004 Cours d'UML
Cas d’études Les contraintes OCL L’étudiant peut emprunter si il a moins de 4 emprunts en cours. Vérifier la cohérence des dates. Le livre ne peut pas être emprunter s’il est déjà. Lorsqu’un livre est acheté, il peut être emprunté 2003/2004 Cours d'UML
Règles OCL Context Etudiant::effectuerEmprunt(livre:Livre) pre :emprunt->size()<4 post : emprunt->size()=emprunt@pre->size()+1 Context Emprunt::emprunt(livre:Livre) Post : dateDebut=System.currentdate Context Livre::emprunter() pre : libre=true post : libre= false Context Etudiant inv: self.dateDebut<=dateFin Context Livre::livre() Post : libre=true 2003/2004 Cours d'UML
Améliorations !! Exprimer le fait que la durée de l’emprunt ne doit pas excéder 3 semaines (21 jours). Nous avons oublié que l’étudiant pouvait rendre le livre. Quels sont les éléments à ajouter? Quels sont les contraintes OCL à ajouter? 2003/2004 Cours d'UML