Introduction aux notations UML et OCL
Transcription
Introduction aux notations UML et OCL
Introduction aux notations UML et OCL use case diagram diagramme de cas d’utilisation le système Nom du cas d’utilisation NomActeur <<actor>> SIExterne « include » Nom du cas d’utilisation Etudiant Description du cas d’utilisation Enseigner un cours Professeur date : 10/09/03 auteur : E. Renaux version : v.0.6 acteur principal : Professeur acteurs secondaires : Etudiant Préparer un cours « include » « extend » Enseigner un cours Points d’extension : exposé énoncé exercice rendu de devoir Enseigner un cours par correspondance Diagramme de cas d ’utilisation du système machin Réalisation du cas d’utilisation "préparer un cours" Précondition il y a plus de trois étudiants présents Scénario nominal 1. Le professeur s ’identifie au système 2. Le système authentifie le professeur 3. ... Scénarios alternatifs A1. Titre du scénario alternatif commence à l ’étape 2 du scénario nominal ... A1.1. Le … ... Exceptions ... Postcondition il y a autant d ’étudiants qu ’au début du cours :-) exigences non fonctionnelles le cours doit durer 1h30 activity diagram diagramme d’activités client agent de caisse Entrer dans magasin [encore un achat dans la liste] Sélectionner un produit [courses terminées] Scanner article Choisir une caisse Y a t ’il encore des articles ? [oui] Poser articles sur tapis [non] Editer ticket Sortie du magasin Ouvrir tiroir Payer Diagramme d’activité des courses class diagram diagramme de classes ClasseParti e 1..3 <<stereotype>> NomClasseAbstraite from nomPaquetage - attributPrivate : Type= valeur # attributProtected : Type + attributPublic - operationPrivate(argument1: Type, …) : TypeRetour # operationProtected + operationPublique <<interface>> NomInterface operation1 () operation2 () ClasseTou t ClassePartie2 <<realize>> ClasseB ClasseA NomClasseAssociatio n operation () NomClasse operation1() operation2() NomSousClasse ClasseCliente operation() note UneClasse 1 attributDeClasse ClasseA nomAssociation role1 0..* role2 operationDeClasse() Classe1 qualif ier Classe2 ClientData unPaquetage IhmClient Diagramme de classe du système Manager ClasseB sequence diagram diagramme de séquence environnement du système jeanClaude :Commerci al système formulaire: IhmVendeu r saisir identifiant :ManagerV ente temps saisieId(id) <<entity>> :BaseVente algo récursif verifierId(id) demande info client lireListeClients(id) demande fiche client lireFicheClient(nom) creerClient(nom) infoPaul:Cl ientData saisir vente saisirVente(produit,quantite,prix) detruire() Diagramme de séquence du scénario nominal du cas d’utilisation "réaliser une vente" statechart diagram diagramme d’états Clé insérée insérer clé scanner un article(codebarre)[invalide] /bip erreur /liste vide Attente scan retirer clé scanner un article(codebarre)[valide] /ajouter liste articles demander total Attente paiement Courses payée / vider liste articles Diagramme d’états d’une caisse component diagram diagramme de composants Appli cliente Base de donnée centrale Diagramme de composant du système boiteOutil.dll deployment diagram diagramme de déploiement Windows NT Linux Firewall serveur central PC Client internet ethernet banque ServeurApplication serveur Web données Limites d'UML OCL Object Constraint Language d’après CSCI3007 Component Based Development Plan Qu’est-ce qu’une contrainte? OCL Concepts OCL Concepts avancés Definition “Une contrainte est la restriction de une ou plusieurs valeurs d’un modèle UML.” Différents types de contraintes Invariant de Classe Precondition d’une operation une contrainte qui doit être satisfaite par toutes les instances de la classe une contrainte qui doit toujours être true avant l’execution de l’ operation Postcondition d’une operation une contrainte qui doit toujours être true après l’execution de l’ operation Pourquoi ? Utiliser OCL préciser un diagramme VOL PassagerVOL vols 0..* 1 CargoVOL AVION 0..* 0..* 1 1 PassagerAvion CargoAvion 15 exemple: Ajouter des invariants VOL type : enum of cargo, passager 0..* vols 1 AVION type : enum of cargo, passager {context VOL inv: type = #cargo implies avion.type = #cargo inv: type = #passager implies avion.type = #passager} 16 OCL? OCL est un langage textuel pour décrire les contraintes dans UML Formel mais simple à utiliser Non ambigüe Sans effets de bord Modèle Exemple Flight Airport origin name: String destination departing Flights departTime: Time * /arrivalTime: Time duration : Interval maxNrPassengers: Integer * flights airline * arriving Flights Airline passengers * {ordered} name: String Passenger $minAge: Integer age: Integer needsAssistance: Boolean 0..1 book(f : Flight) CEO airline 0..1 context et self toute expression OCL est associée à un contexte spécifique Ce contexte est souvent l'élément UML auquel cette contrainte est attachée Ce contexte peut être désigné dans l'expression par le mot clé ‘self’. ‘self’ est implicite dans toute expression OCL Équivalent à`this’ en Java Notation Les Contraintes peuvent figurer dans le modèle UML ou dans un document séparé. L'expression: context Flight inv: self.duration < 4 Est identique à: context Flight inv: duration < 4 Et à: <<invariant>> duration < 4 Flight duration: Integer Elements d'une expression OCL On peut utiliser: Types de base: String, Boolean, Integer, Real. Éléments du modèle UML attributs, et classes Operations booléennes des classes query operations (sans effets de bord) Les associations du modèle UML Y compris les noms de rôles conseil: utiliser des rôles dans UML pour simplifier OCL Exemple: OCL types de base context Compagnie inv: name.toLower = ‘klm’ context Passager inv: age >= ((9.6 - 3.5)* 3.1).floor implies mature = true Classes, Modèle et attributs attributs context VOL inv: self.maxNrPassagers <= 1000 Attributs de Classe context Passager inv: age >= Passager.minAge Exemple: operations context Flight inv: self.departTime.difference(self.arrivalTime) .equals(self.duration) Time midnight: Time month : String day : Integer year : Integer hour : Integer minute : Integer difference(t:Time):Interval before(t: Time): Boolean plus(d : Interval) : Time Interval nrOfDays : Integer nrOfHours : Integer nrOfMinutes : Integer equals(i:Interval):Boolean Interval(d, h, m : Integer) : Interval Exemple: navigations Flight Airport origin name: String destination departing Flights departTime: Time * /arrivalTime: Time duration : Interval maxNrPassengers: Integer * arriving Flights context Flight inv: origin <> destination inv: origin.name = ‘Amsterdam’ context Flight inv: airline.name = ‘KLM’ Classes Association context Person inv: if employer.name = ‘Klasse Objecten’ then job.type = #trainer else job.type = #programmer endif Job type : {trainer, programmer} Person * employee 1 employer Company name : String Collections dans OCL La plupart des navigations retournent des collections d' elements Flight type : enum of cargo, passenger 0..* flights 1 Airplane type : enum of cargo, passenger Trois Sous types de Collection Set: Bag: arrivingFlights(dans le contexte Airport) Non-ordonné, unique arrivingFlights.duration (dans le contexte Airport) Non-ordonné, non-unique Sequence: passagers (dans le contexte Flight) ordonné, non-unique Collection : operations OCL a un grand nombre d'opérations prédéfinies sur les collections. Syntax: collection->operation collect Syntaxe: collection->collect(elem : T | expr) collection->collect(elem | expr) collection->collect(expr) résumé: collection.expr L'opération collect retourne la collection des valeurs obtenues par application de expr aux éléments de collection select Syntaxe: collection->select(elem : T | expression) collection->select(elem | expression) collection->select(expression) select retourne le sous ensemble des éléments pour lesquels expression est true Exemple: collect context Airport inv: self.arrivingFlights -> collect(airLine) ->notEmpty airp1 f1 airline1 f2 f3 airp2 airline2 f4 airline3 arriving flights departing flights f5 forAll Syntaxe: collection->forAll(elem : T | expr) collection->forAll(elem | expr) collection->forAll(expr) True si expr est true pour tous les éléments de collection Exemple: forAll context Airport inv: self.departingFlights->forAll(departTime.hour>6) f1 depart = 7 airp1 f2 depart = 5 f3 depart = 8 airp2 f4 depart = 9 f5 depart = 8 departing flights arriving flights airline1 airline2 airline3 exists Syntaxe: collection->exists(elem : T | expr) collection->exists(elem | expr) collection->exists(expr) true si il existe au moins un élément de collection pour lequel expr est true. Exemple: exists context Airport inv: self.departingFlights->exists(departTime.hour<6) f1 depart = 7 airp1 f2 depart = 5 f3 depart = 8 f4 depart = 9 airp2 departing flights arriving flights f5 depart = 8 airline1 airline2 airline3 Exemple: select context Airport inv: self.departingFlights->select(duration<4)->notEmpty f1 duration = 2 airp1 f2 duration = 5 f3 duration = 3 f4 duration = 5 airp2 arriving flights f5 duration = 2 airline1 airline2 airline3 departing flights Exemple : Iterate Exemple iterate: context Airline inv: flights->select(maxNrPassengers > 150)->notEmpty Est identique à: context Airline inv: flights->iterate (f : Flight; answer : Set(Flight) = Set{ } | if f.maxNrPassengers > 150 then answer->including(f) else answer endif )->notEmpty autres operations sur collection isEmpty notEmpty size count(elem):occurences d'elem dans collection includes(elem): true si elem dans collection excludes(elem) includesAll(coll) Result et postcondition Exemple pre et postcondition context Airline::servedAirports() : Set(Airport) pre : -- none post: result = flights.destination->asSet Statechart L' operation oclInState retourne true si l'objet est dans l'état spécifié Bottle filled : enum {empty, half, full} open context Bottle inv: self.oclInState(closed) implies filled = #full closed Variables Locales let definit des variables locales à une contrainte: Let var : Type = <expression1> in <expression2> Exemple: context Airport inv: Let supportedAirlines : Set (Airline) = self.arrivingFlights -> collect(airLine) in (supportedAirlines ->notEmpty) and (supportedAirlines ->size < 500) heritage de contraintes Liskov’s Substitution Principle (LSP): “Partout où une instance d'une classe est attendue, une instance d'une sous classe peut lui être substituée” heritage de contraintes Consequences de LSP pour les invariants: un invariant est toujours hérité par ses sous classes. Les sousclasses peuvent renforcer l'invariant. Consequences de LSP sur les preconditions et postconditions: une precondition peut être weakened (contravariance) une postcondition peut être strengthened (covariance) OCL Tools FREE parser from IBM Cybernetics www.boldsoft.com ICON computing www-st.inf.tu-dresden.de/ocl/ Boldsoft www.cybernetic.org University of Dresden http://www.software.ibm.com/ad/ocl www.iconcomp.com Royal Dutch Navy Others … … Conclusions OCL invariants allow you to OCL pre- and postconditions allow you to model more precisely remain implementation independent specify contracts (design by contract) specify interfaces of components more precisely OCL usage tips keep constraints simple always combine natural language with OCL use a tool to check your OCL References [UML 1.3] OMG UML Specification v. 1.3, OMG doc# ad/06-08-99 [UML 1.4] OMG UML Specification v. 1.4, UML Revision Task Force recommended final draft, OMG doc# ad/01-02-13. Infos Web: UML 1.4 RTF: www.celigent.com/omg/umlrtf OMG UML Tutorials: www.celigent.com/omg/umlrtf/tutorials.htm UML 2.0 Working Group: www.celigent.com/omg/adptf/wgs/uml2wg.htm OMG UML Resources: www.omg.org/uml/