81
Conception par contrats avec UML OCL – Object Constraint Language Gerson Suny ´ e [email protected] LINA Introduction ` a OCL – p.1

Conception par contrats avec UML

Embed Size (px)

Citation preview

Page 1: Conception par contrats avec UML

Conception par contrats avec UMLOCL – Object Constraint Language

Gerson [email protected]

LINA

Introduction a OCL – p.1

Page 2: Conception par contrats avec UML

Plan

IntroductionInvariants, pré et post-conditions

Spécification de propriétés

Expressions OCL portant sur les Associations

Concepts avancés

Conclusion

Introduction a OCL – p.2

Page 3: Conception par contrats avec UML

Introduction

Introduction a OCL – p.3

Page 4: Conception par contrats avec UML

Motivation

Peut-on rendre plus précis un diagramme UML?

Introduction a OCL – p.4

Page 5: Conception par contrats avec UML

Motivation

e p o u s e m a r iO. . 1 O. . 1Pe r s o n n en a i s s a n c e : D a t ep r e n o m : S t r i n gn o m : S t r i n gs e x e : e n u m { h o m m e, f e m m e }a g e ( ) : I n t e g e rL ' é p o u s e d u m a r i d ' u n e p e r s o n n e e s t e l l em ê m e. E n d ' a u t r e s t e r m e s, l e m a r i d ' u n ef e m m e l ' a p o u r é p o u s e.

Les diagrammes UMLmanquent parfois deprécision.

Le langage naturel estsouvent ambigu.

Introduction a OCL – p.5

Page 6: Conception par contrats avec UML

Conception par contrats avec UML

Ajout de contraintes àdes éléments de modéli-sation.

e p o u s e m a r iO. . 1 O. . 1Pe r s o n n en a i s s a n c e : D a t ep r e n o m : S t r i n gn o m : S t r i n gs e x e : e n u m { h o m m e, f e m m e }a g e ( ) : I n t e g e rL ' é p o u s e d u m a r i d ' u n e p e r s o n n e e s t e l l em ê m e. E n d ' a u t r e s t e r m e s, l e m a r i d ' u n ef e m m e l ' a p o u r é p o u s e .

context Personne

inv : self .epouse→notEmpty() impliesself .epouse.mari =self andself .mari→notEmpty() implies

self .mari.epouse =self}

Introduction a OCL – p.6

Page 7: Conception par contrats avec UML

OCL – Object Constraint Language

Langage de description de contraintes de UML.

Permet de restreindre une ou plusieurs valeurs d’unou de partie d’un modèle.

Utilisé dans les modèles UML ainsi que dans sonméta-modèle (à travers les stéréotypes).

Formel, non ambigu, mais facile à utiliser (mêmepar les non mathématiciens).

Introduction a OCL – p.7

Page 8: Conception par contrats avec UML

OCL – Object Constraint Language

Une contrainte OCL est une expression booléenne, sanseffet de bord, portant sur les éléments suivants:

Types de base: String, Boolean, Integer, Real;

Classificateurs et ses propriétés: Attributs, Opérationqui sont des "fonctions pures";

Associations;

États (des machines d’états associées).

Introduction a OCL – p.8

Page 9: Conception par contrats avec UML

Différentes sortes de contraintes (1/2)

Invariants de classe.Une contrainte qui doit être respectée par toutesles instances d’une classe.

Pré-condition d’une opération (ou transition).Une contrainte qui doit être toujours vraieavantl’exécution d’une opération.

Post-condition d’une opération (ou transition).Une contrainte qui doit être toujours vraieaprèsl’exécution d’une opération.

Introduction a OCL – p.9

Page 10: Conception par contrats avec UML

Différentes sortes de contraintes (2/2)

Définition de nouvelles propriétés.Définition de nouveaux attributs ou opérations àl’intérieur d’une classe.

Établir la valeur initiale d’un attribut.

Définition de propriétés dérivées.Préciser la valeur d’un attribut ou associationdérivés.

Spécifier le corps d’une opération.Spécification d’une opération dans effet de bord(query).

Introduction a OCL – p.10

Page 11: Conception par contrats avec UML

Stéréotypes des contraintes

Trois stéréotypes sont définis en standard dans UML:

Invariants de classe: «invariant»

Pré-conditions: «precondition»

Post-conditions: «postcondition»

Introduction a OCL – p.11

Page 12: Conception par contrats avec UML

Notation

Directement à l’intérieur d’un modèle ou dans undocument séparé:

context Personne inv: self.age < 150context Personne inv: age < 50

Personne+nom: String+age: Integer

<<invariant>> age < 150

Personne{age < 150}

+nom: String+age:Integer

Introduction a OCL – p.12

Page 13: Conception par contrats avec UML

Plan

Introduction

Invariants, pré et post-conditionsSpécification de propriétés

Expressions OCL portant sur les Associations

Concepts avancés

Conclusion

Introduction a OCL – p.13

Page 14: Conception par contrats avec UML

Invariants, pré et post-conditions

Introduction a OCL – p.14

Page 15: Conception par contrats avec UML

Exemple de modèle

Introduction a OCL – p.15

Page 16: Conception par contrats avec UML

Contexte

Toute contrainte OCL est liée à un contextespécifique, l’élément auquel la contrainte estattachée.

Le contexte peut être utilisé à l’intérieur d’uneexpression grâce au mot-clef «self».

Implicite dans toute expression OCL.Similaire à celui de Smalltalk ou Python, au«this» de C++ et Java, ou au «Current» de Eiffel.

Introduction a OCL – p.16

Page 17: Conception par contrats avec UML

Invariants de classe

Dans un état stable, toute instance d’une classe doitvérifier les invariants de cette classe.

Expression OCL stéréotypée «invariant».

Exemples:

context e : Etudiant inv ageMinimum: e.age > 16

context e : Etudiant inv : e.age > 16

context Etudiant inv : self .age > 16Introduction a OCL – p.17

Page 18: Conception par contrats avec UML

Éléments d’une expression OCL

Les éléments suivants peuvent être utilisés dans uneexpression OCL:

Les types de base: String, Boolean, Integer, Real.

Les Classificateurs et leurs propriétés:Attributs d’instance et de classe.Opérations deQuery(i.e. sans effet de bord)d’instance et de classe.États des machines d’états associées.

Associations du modèle UML.

Introduction a OCL – p.18

Page 19: Conception par contrats avec UML

Types de base

type valuesBoolean true, falseInteger 1, -5, 2, 34, 26524, . . .Real 1.5, 3.14, . . .

String ‘To be or not to be. . . ’

Introduction a OCL – p.19

Page 20: Conception par contrats avec UML

Opérations sur les types de base

type operationsInteger =, *, +, -, /, abs, div, mod, max, minReal =, *, +, -, /, abs, floor, round,

max, min, >, <, . . .String =, size, concat, toUpper, toLower, substring

Introduction a OCL – p.20

Page 21: Conception par contrats avec UML

Objets et propriétés

Une expression OCL peut faire référence à:

Des classificateurs (types, classes, interfaces,associations, datatypes, cas d’utilisation, etc.).

Des propriétés:Un Attribut.Une Opération dontisQueryest vrai.

Un État.Un rôle d’association.

Introduction a OCL – p.21

Page 22: Conception par contrats avec UML

Propriétés: Attributs

On utilise la notation pointée:

Attributs d’instance:

context Enseignantinv :

self . salaire < 10

Attributs de classe:

context Enseignantinv :

self . salaire < Enseignant .salaireMaximumIntroduction a OCL – p.22

Page 23: Conception par contrats avec UML

Propriétés: Types énumérés

Définition: enum{value1, value2, value3}Pour éviter les conflits de nom, on utilise le nom del’énumération:Enum::val1

context Enseignantinv :

self . titre = Titre :: prof implies

self . salaire > 10

Introduction a OCL – p.23

Page 24: Conception par contrats avec UML

Propriétés: Opérations deQuery

Notation pointée:

Opérations d’instance:

context Etudiant

self .age() > 16

Opérations de classe:

context Etudiant inv :

self .age() > Etudiant .ageMinimum()

Introduction a OCL – p.24

Page 25: Conception par contrats avec UML

Propriétés: États

Accessibles avecoclInState():

context Departement:: ajouter (e: Enseignant)

pre: e.oclInState( disponible )

pre:e.oclInState( indisponible :: en vacances)

−− etats imbriques

Introduction a OCL – p.25

Page 26: Conception par contrats avec UML

Spécification d’opérations

Inspirée des Types Abstraits: une opération estcomposée par une signature, des pré-conditions etdes post-conditions.

Permet de contraindre l’ensemble de valeursd’entrée d’une opération.

Permet de spécifier la sémantique d’une opération:c’est qu’elle fait, et non comment elle le fait.

Introduction a OCL – p.26

Page 27: Conception par contrats avec UML

Pré-condition

Ce qui doit être respecté par le client (l’appelant del’opération)

Représentée par une expression OCL stéréotypée«precondition»

context Departement:: ajouter (e : Enseignant) :Integer

pre nonNul: e. notNil ()

Introduction a OCL – p.27

Page 28: Conception par contrats avec UML

Post-condition

Spécifie ce qui devra être vérifié après l’exécutiond’une opération.

Représentée par une expression OCL stéréotypée«postcondition»:

Opérateurs spéciaux:@pre: accès à une valeur d’une propriété d’avant

l’opération (old de Eiffel).result: accès au résultat de l’opération.

Introduction a OCL – p.28

Page 29: Conception par contrats avec UML

Post-condition

context Etudiant :: age() :Integer

post correct : result = (today − naissance ). years ()

context Typename::operationName(param1: type1, ...): Type

post: result = ...

context Typename::operationName(param1: type1, ...): Type

post resultOk : result = ...

Introduction a OCL – p.29

Page 30: Conception par contrats avec UML

Postcondition: valeurs précédentes

A l’intérieur d’une postcondition, deux valeurs sontdisponibles pour chaque propriété:

la valeur de la propriété avant l’opération.

la valeur de la propriété après la fin de l’opération.

context Personne :: anniversaire ()

post: age = age@pre + 1

context Enseignant :: augmentation(v :Integer)

post: self . salaire =self . salaire@pre + v

Introduction a OCL – p.30

Page 31: Conception par contrats avec UML

Body

Spécifie le corps d’une opération sans effet de bord(query).

context Universite :: enseignants () :Set(Enseignant)

body: self . departements . enseignants→asSet()

Introduction a OCL – p.31

Page 32: Conception par contrats avec UML

Plan

Introduction

Invariants, pré et post-conditions

Spécification de propriétésExpressions OCL portant sur les Associations

Concepts avancés

Conclusion

Introduction a OCL – p.32

Page 33: Conception par contrats avec UML

Spécification de propriétés

Introduction a OCL – p.33

Page 34: Conception par contrats avec UML

Définitions

Définition de nouveaux attributs et opérations dansune classe existante.

contextClasse

def: nomatt : type = expr

def: nomop( ... ) : type = expr

Introduction a OCL – p.34

Page 35: Conception par contrats avec UML

Définitions

Utile pour décomposer des expressions complexes,sans surcharger le modèle.

context Enseignant

def: eleves () : Bag(Etudiants) =

self . enseigne . etudiant

inv : self . titre = Titre :: prof implies self . eleves ()

→forAll (each | each .estAdmis())

−− un professeur a toujours 100% de reussite

Introduction a OCL – p.35

Page 36: Conception par contrats avec UML

Valeur initiale

Spécification de la valeur initiale d’un attribut oud’un rôle (Association End).

Le type de l’expression doit être conforme au typede l’attribut ou du rôle.

context Typename::attributeName: Type

init : −− expression representant la valeur initiale

context Enseignant :: salaire :Integer

init : 800

Introduction a OCL – p.36

Page 37: Conception par contrats avec UML

Propriétés dérivées

Spécification de la valeur dérivée d’un attribut oud’un rôle (Association End).

context Typename::assocRoleName: Type

derive: −− expression representant la regle

−− de derivation

Introduction a OCL – p.37

Page 38: Conception par contrats avec UML

Propriétés dérivées

context Enseignant :: service :Integer

derive: self . enseigne . heures→sum()

context Personne :: celibataire :Boolean

derive: self . conjoint→isEmpty()

Introduction a OCL – p.38

Page 39: Conception par contrats avec UML

Plan

Introduction

Invariants, pré et post-conditions

Spécification de propriétés

Expressions OCL portant sur les AssociationsConcepts avancés

Conclusion

Introduction a OCL – p.39

Page 40: Conception par contrats avec UML

Expressions OCL portant sur lesAssociations

Introduction a OCL – p.40

Page 41: Conception par contrats avec UML

Rôles: navigation

Il est possible de naviguer à travers les associations, enutilisant le rôle opposé:

1 1 *universite departement

Départementnom : Stringajouter(Enseignant)

Universiténom : String

context Departement

inv : self . universite . notNil ()

context Universite

inv : self .departement (...)

Introduction a OCL – p.41

Page 42: Conception par contrats avec UML

Rôles: navigation

Le type de la valeur de l’expression dépend de lacardinalité maximale du rôle. Si égal à 1, alors c’est unclassificateur. Si > 1, alors c’est une collection.

context Matiere

−− un objet:

inv : self . enseignant .oclInState( disponible )

−− une collection (Set):

inv : self .competent→notEmpty()

Introduction a OCL – p.42

Page 43: Conception par contrats avec UML

Rôles: navigation

Quand le nom de rôle est absent, le nom du type (enminuscule) est utilisé.

Il est possible de naviguer sur des rôles decardinalité 0 ou 1 en tant que collection:

context Departementinv : self . chef→size() = 1

context Departementinv : self . chef .age > 40

context Personneinv : self .epouse→notEmpty()

implies self .epouse.sexe = Sexe:: femme

Introduction a OCL – p.43

Page 44: Conception par contrats avec UML

Rôles: navigation

Il est possible de combiner des expressions:

context Personneinv :

self .epouse→notEmpty() implies self.epouse.age≥ 18 and

self .mari→notEmpty() implies self.mari.age≥ 18

Introduction a OCL – p.44

Page 45: Conception par contrats avec UML

Association Classe

On utilise le nom de la classe-association, enminuscules:

context Etudiant inv :

−− Ensemble des notes:

self . note

Étudiantnom : stringnasissance : DateestAdmis() : Boolage() : Integer

Notedate : Datevaleur : Integer

Matièreheures : Integernom : Stringmatiereetudiant

Introduction a OCL – p.45

Page 46: Conception par contrats avec UML

Association Classe

Il est possible de naviguer en utilisant les noms derôle et la notation pointée:

context Note inv :

self . etudiant .age()≥ 18

self . matiere . heures > 3

Étudiantnom : stringnasissance : DateestAdmis() : Boolage() : Integer

Notedate : Datevaleur : Integer

Matièreheures : Integernom : Stringmatiereetudiant

Introduction a OCL – p.46

Page 47: Conception par contrats avec UML

Associations qualifiées

La valeur du qualificatif est mis entre crochets:

context Universite inv : self . etudiants [8764423]

Quand la valeur n’est pas précisée, le résultat est unecollection:

context Universite inv : self . etudiants

Étudiantnom : stringnasissance : DateestAdmis() : Boolage() : Integer

Universiténom : String etudiantscode:integer

Introduction a OCL – p.47

Page 48: Conception par contrats avec UML

Sortes de Collection (1/2)

Set: ensemble non ordonné.Résultat d’une navigation.{1, 2, 45, 4}

OrderedSet: ensemble ordonné.navigations combinées.{1, 2, 4, 45}

Introduction a OCL – p.48

Page 49: Conception par contrats avec UML

Sortes de Collection (2/2)

Bag: multi-ensemble non ordonné.navigations combinées.{1, 3, 4, 3}

Sequence: multi-ensemble ordonné.navigation à travers un rôle ordonné {Ordered}{1, 3, 3, 5, 7}{1..10}

Introduction a OCL – p.49

Page 50: Conception par contrats avec UML

Collections de collections

En UML 1.5, les collections de collections étaient misesà plat automatiquement. En UML 2.0 ce n’est plus lecas, la mise à plat doit être explicitement spécifiée.

Set{ Set{1, 2}, Set{3, 4}} → flatten () =Set{1, 2, 3, 4}

Introduction a OCL – p.50

Page 51: Conception par contrats avec UML

Opérations sur les collections

isEmpty() : vrai si la collection est vide.

notEmpty() : vrai si la collection a au moins unélément.

size() : nombre d’éléments dans la collection.

count (elem) : nombre d’occurrences deelemdans lacollection.

Introduction a OCL – p.51

Page 52: Conception par contrats avec UML

Opération sur les collections

Select et Reject

Collect

ForAll

Exists

Iterate

Introduction a OCL – p.52

Page 53: Conception par contrats avec UML

Select et Reject

collection→select(elem:T | bool−expr) : collection

collection→reject (elem:T | bool−expr) : collection

Sélectionne le sous-ensemble d’une collection pourlequel la propriétéexprest vraie (ou fausse –reject).

Introduction a OCL – p.53

Page 54: Conception par contrats avec UML

Select et Reject

Syntaxes possibles:

context Departementinv :

self . enseignants→select(age > 50)→notEmpty()

self . enseignants→reject (age < 23)→isEmpty()

context Departementinv :

−− avec iterateur

self . enseignants→select(e | e.age > 50)→notEmpty()

context Departementinv :

−− avec iterateur typé

self . enseignants→select(e : Enseignant | e.age > 50)

→notEmpty() Introduction a OCL – p.54

Page 55: Conception par contrats avec UML

Collect

collection→ collect (expr) : collection

Évalue l’expressionexprpour chaque élément de lacollection, et rend une autre collection, composéepar les résultats de l’évaluation.

Le résultat est un multi-ensemble (bag).

Introduction a OCL – p.55

Page 56: Conception par contrats avec UML

Collect

Syntaxe:

context Departement:

self . enseignants→ collect (nom)

self . enseignants→ collect (e | e.nom)

self . enseignants→ collect (e: Enseignant | e.nom)

−− conversion de Bag en Set:

self . enseignants→ collect (nom)→asSet()

−− Raccourci:

self . enseignants .nom

Introduction a OCL – p.56

Page 57: Conception par contrats avec UML

For All

collection→forAll (elem:T | bool−expr) : Boolean

Vrai si exprest vrai pour chaque élément de la collection.

Introduction a OCL – p.57

Page 58: Conception par contrats avec UML

For All

Syntaxe:

context Departementinv :

self . enseignants→forAll ( titre = Titre :: mdc)

self . enseignants→forAll (each | each. titre = Titre :: mdc)

self . enseignants→forAll (each: Enseignants |

each. titre = Titre :: mdc)

Introduction a OCL – p.58

Page 59: Conception par contrats avec UML

For All

Produit cartésien:

context Departementinv :

self . enseignant→forAll (e1, e2 : Enseignant |

e1 <>e2 implies e1.nom<>e2.nom

−− equivalent à

self . enseignants→forAll (e1 | self . enseignants→

forAll (e2 | e1<>e2 implies e1.nom<>e2.nom))

Introduction a OCL – p.59

Page 60: Conception par contrats avec UML

Exists

collection→exists(boolean−expression) :Boolean

Vrai si exprest vrai pour au moins un élément de lacollection.

context: Departementinv :

self . enseignants→exists(e: Enseignant |

p.nom =’Martin’)

Introduction a OCL – p.60

Page 61: Conception par contrats avec UML

Iterate

collection→ iterate (elem: T; reponse: T = <valeur> |

<expr−avec−elem−et−reponse>)

Opération générique (et complexe) applicable aux collec-

tions.

Introduction a OCL – p.61

Page 62: Conception par contrats avec UML

Iterate

context Departementinv :

self . enseignants→select(age > 50)→notEmpty()

context Departementinv :

−− expression équivalente:

self . enseignants→ iterate (e: Enseignant ;

answer:Set(Enseignant) =Set {} |

if e.age > 50then answer.including (e)

else answerendif) → notEmpty()

Introduction a OCL – p.62

Page 63: Conception par contrats avec UML

Autres opérations sur les Collections

includes(elem), excludes(elem) : vrai si elemestprésent (ou absent) dans la collection.

includesAll(coll) : vrai si tous les éléments decollsont dans la collection.

union (coll), intersection (coll) : opérationsclassiques d’ensembles.

asSet(), asBag(), asSequence() : conversions de type.

Introduction a OCL – p.63

Page 64: Conception par contrats avec UML

Plan

Introduction

Invariants, pré et post-conditions

Spécification de propriétés

Expressions OCL portant sur les Associations

Concepts avancésConclusion

Introduction a OCL – p.64

Page 65: Conception par contrats avec UML

Concepts avancés

Introduction a OCL – p.65

Page 66: Conception par contrats avec UML

Conformance de type

Type Est conforme àSet(T) Collection(T)

Sequence(T) Collection(T)Bag(T) Collection(T)Integer Real

Introduction a OCL – p.66

Page 67: Conception par contrats avec UML

Propriétés prédéfinies

oclIsTypeOf(t : OclType) : Boolean

oclIsKindOf (t : OclType) : Boolean

oclInState(s : OclState ) :Boolean

oclIsNew() : Boolean

oclAsType(t : OclType) : instance deOclType

Exemples:

context Universite

inv : self .oclIsTypeOf(Universite ) −− vrai

inv : self .oclIsTypeOf(Departement) −− faux

Introduction a OCL – p.67

Page 68: Conception par contrats avec UML

ExpressionLet

Quand une sous-expression apparaît plus d’une fois dansune contrainte, il est possible de la remplacer par unevariable qui sert de alias:

context Personinv :

let income : Integer = self . job . salary→sum() in

if isUnemployedthen

income < 100

else

income≥ 100

endifIntroduction a OCL – p.68

Page 69: Conception par contrats avec UML

Valeurs précédentes (1/2)

Quand la valeur @pre d’une propriété est un objet, toutesles valeurs accédées à partir de cet objet sont nouvelles:

[email protected]

−− l’ancienne valeur de b, disons X,

−− et la nouvelle valeur de c de X

[email protected]@pre

−− l’ancienne valeur de b, disons X,

−− et l’ancienne valeur de c de x.

Introduction a OCL – p.69

Page 70: Conception par contrats avec UML

Valeurs précédentes (2/2)

Avant

Après

a:A

b b1:B c

b2:B

c1:C

a:A cb b2:B c2:C

cb1:B c3:C

[email protected]−− la nouvelle valeur de b1.c, c3

[email protected]@pre−− l’ancienne valeur de b1.c, c1

a.b.c−− la nouvelle valeur de b2.c, c2Introduction a OCL – p.70

Page 71: Conception par contrats avec UML

Héritage de contrats

Rappel: principe de substitution de Liskov (LSP):

«Partout où une instance d’une classe estattendue, il est possible d’utiliser uneinstance d’une de ses sous-classes.»

Introduction a OCL – p.71

Page 72: Conception par contrats avec UML

Héritage d’invariants

Conséquences du principe de substitution de Liskov pourles invariants:

Les invariants sont toujours hérités par lessous-classes.

Un sous-classe peut renforcer l’invariant.

Introduction a OCL – p.72

Page 73: Conception par contrats avec UML

Héritage de pré et post-conditions

Conséquences du LSP pour les pré et post-conditions:

Une pré-condition peut seulement être assouplie(contrevariance).

Une post-condition peut seulement être renforcée(covariance).

Introduction a OCL – p.73

Page 74: Conception par contrats avec UML

Plan

Introduction

Invariants, pré et post-conditions

Spécification de propriétés

Expressions OCL portant sur les Associations

Concepts avancés

Conclusion

Introduction a OCL – p.74

Page 75: Conception par contrats avec UML

Conclusion

Introduction a OCL – p.75

Page 76: Conception par contrats avec UML

Développement en cours

Amélioration de la grammaire.

Développement d’un méta-modèle (syntaxeabstraite).

UML 2.0.

Introduction a OCL – p.76

Page 77: Conception par contrats avec UML

Autres nouveautés dans UML 2.0

Tuples.

Collections imbriquées (collectNested).

Envoi de messages.

context Subject :: hasChanged()

−− la post-condition doit asssurer que le message update()

−− a ete envoye a tous les observateurs:

post: observers→forAll ( o | o^update() )

Introduction a OCL – p.77

Page 78: Conception par contrats avec UML

Conseils de modélisation

Faire simple: les contrats doivent améliorer laqualité des spécifications et non les rendre pluscomplexes.

Toujours combiner OCL avec un langage naturel: lescontrats servent à rendre les commentaires moinsambigus et non à les remplacer.

Utiliser un outil.

Introduction a OCL – p.78

Page 79: Conception par contrats avec UML

Rappels

La conception par contrats permet aux concepteurs de:

Modéliser de manière plus précise.

Mieux documenter un modèle.

Rester indépendant de l’implémentation.

Identifier les responsabilités de chaque composant.

Introduction a OCL – p.79

Page 80: Conception par contrats avec UML

Applicabilité

Génération de code:assertions en Eiffel, Sather.dans d’autres langages, grâce à des outilsspécialisés ou au patron Contract.

Génération de tests mieux ciblés.

Introduction a OCL – p.80

Page 81: Conception par contrats avec UML

Références

The Object Constraint Language – Jos Warmer,Anneke Kleppe.

OCL home page – www.klasse.nl/ocl/

OCL tools – www.um.es/giisw/ocltools

OMG Specification v1.5.

OMG UML 2.0 Working Group.

Introduction a OCL – p.81