Vous êtes sur la page 1sur 16

Les collections dans OCL (INF314010)

Hafedh MILI

INF3140 - Collections dans OCL

Plan

Introduction Oprations sur Collection Oprations sur Set Oprations sur OrderedSet Oprations sur Bag Oprations sur Sequence Opration iterate Exemples
INF3140 - Collections dans OCL 2

1. Introduction

Le but de ce chapitre est de:


Dcrire les types de collections dans OCL S'exercer sur les collections avec USE

INF3140 - Collections dans OCL

Hirarchie de types dans OCL

T
OrderedSet

INF3140 - Collections dans OCL

Collections dans OCL

Les collections de OCL sont gnriques, i.e. paramtres par le type d'lments dans la collection

Similaire la gnricit de Java: ArrayList<Etudiant>, HashMap<String,Etudiant>, etc

Lorsqu'on dclare une variable du type collection, le type des lments est:

Soit explicitement dclar:

use> ?let set_entiers: Set(Integer) = Set{1..4} in set_entiers>size() use> ? Set{1..4}->forAll(v | v div 2 <= 2)
INF3140 - Collections dans OCL 5

Soit dduit par l'interprteur d'aprs le contexte

Oprations sur les collections

On peut parler de trois types d'oprations

Oprations communes toutes les collections

Elles ont la mme signature et le mme comportement

Oprations implantes par toutes les collections, mais de faon lgrement diffrente

Diffrente signature, ou Diffrente smantique

Oprations spcifiques certains types de collection

INF3140 - Collections dans OCL

2. Oprations sur Collection

size(): Integer

Le nombre d'lments dans la collection

includes(object: T): Boolean

Retourne vrai si l'argument est inclus dans la collection

excludes(object : T): Boolean

Retourne vrai si l'argument n'est pas inclus dans la collection

count(object: T): Integer

Retourne le nombre d'occurrences de l'argument dans la collection

includesAll(col: Collection(T)):Boolean

Retourne vrai si tous les lments de l'argument sont inclus dans la collection

excludesAll(col: Collection(T)): Boolean

Retourne vrai si aucun des lments de col n'est inclus dans la collection
INF3140 - Collections dans OCL 7

Oprations sur Collection (suite)

isEmpty(): Boolean

Retourne vrai si la collection is vide

notEmpty(): Boolean

Retourne vrai si la collection n'est pas vide

sum(): T

Retourne la somme des lments de la collection. S'applique aux collections de Integer et Real

product(c2: Collection(T2)): Set(Tuple(first:T,second: T2))

Retourne le produit cartsien de la collection avec l'argument, sous la forme d'un ensemble (Set) de paires (Tuple deux lments), le premier lment appartenant la collection et le deuxime appartenant c2

INF3140 - Collections dans OCL

Oprations sur Collection (suite)


Les itrateurs:

forAll(variables | expression) :Boolean

Retourne vrai si l'expression est vrai pour toutes les valeurs de 'variables' prises dans la collection

exists(variables | expression): Boolean

Retourne vrai s'il existe au moins une valeur possible des variables prises dans la collection pour laquelle expression est vraie

one(variables | expression): Boolean

Retourne vrai s'il existe exactement une valeur des variables prises dans la collection pour laquelle expression est vraie

isUnique(variables | expression): Boolean

Retourne vrai si expression retourne une valeur unique pour chaque valeur de 'variables' prise dans la collection

any(variables | expression): T

Retourne un lment (1 er) de la collection (un 'binding' des/de la variables) pour lequel l'expression est vrai

collect(variables | expression)

Retourne la collection d'lments (applatie) rsultant de l'application de 'expression' sur la variable

INF3140 - Collections dans OCL

Oprations sur Collection (suite)


Les itrateurs suivants ont des smantiques lgrement diffrentes, dpendant de la collection source (self/receiver):

select(variable | predicat) :Collection(T)

Retourne la sous-collection (de mme type que self) qui contient les lments pour lesquels le prdicat est vrai

reject(variable | expression): Collection(T)

Retourne la sous-collection (de mme type que self) qui contient les lments pour lesquels le prdicat est vrai

collectNested(variable | expression): Collection(T)

Retourne la collection qui rsulte de l'application de expression sur la variable, tout en prservant l'imbrication. Pour Set et Bag, le rsultat est un Bag. Pour Sequence, le rsultat est aussi une Sequence

sortedBy(variable | expression): Collection(T)

Retourne les lments de la collection tris par la valeur de expression. Pour Set, cela retourne un OrderedSet, pour Bag et Sequence, cela retourne une Sequence
INF3140 - Collections dans OCL 10

Exemples

size(): Integer

? Set{1,2,3,4}->size() ? Set{1..4,8..12}->size()

includes(object: T): Boolean

? Set{1..4}->includes(2) ? Bag{1,1,1,2,3,2}->includes(1) ? Set{'bonjour','bonsoir'}->includes('bonjour') ? Set{'bonjour','bonsoir'}->includes('bon') ? Set{Bag{1,1,2}, Set{1,2}}->includes(1) ? Set{Bag{1,1,2}, Set{1,2}}->includes(Bag{1}) ? Set{Bag{1,1,2}, Set{1,2}}->includes(Set{1,2}) ? Set{Bag{1,1,2}, Set{1,2}}->flatten()->includes(1)

En modlisation, pouvez-vous penser des exemples d'ensembles d'ensembles?

INF3140 - Collections dans OCL

11

Exemples (suite)

count(object: T): Integer

? Set{1..4}->count(3) ? Bag{1..4,1..4}->count(2)

includesAll(col: Collection(T)):Boolean

? Set{1..4}->includesAll(Set{1..3}) ? Set{1..4}->includesAll(Set{3..5}) ? Set{1..4}->includesAll(Bag{1,1,2})

excludesAll(col: Collection(T)): Boolean

? Set{1..4}->excludesAll(Set{3..5}) ? Set{1..4}->excludesAll(Set{5..8})

INF3140 - Collections dans OCL

12

Exemples (suite)

isEmpty(): Boolean

? Set{}->isEmpty() ? Set{1..2}->isEmpty() ? Set{2..1}->isEmpty()

sum(): T

? Set{1..10}->sum() ? Bag{1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10}->sum()

394 :-)

product(c2: Collection(T2)): Set(Tuple(first:T,second: T2))

?let ens = Set{1..2} in ens->product(ens)

INF3140 - Collections dans OCL

13

Exemples (fin)

forAll(variables | expression) :Boolean

? Set{1,2,3,4,5}->forAll(x| 1<= x <= 5) ? Set{'bonjour','bonsoir','bon aprs-midi','bonne nuit'}->forAll( x | x.substring(1,3) = 'bon')

exists(variables | expression): Boolean

? Set{'bonjour','bonsoir','bon aprs-midi','bonne nuit'}->exists( x | x.substring(4,4) = 's')

one(variables | expression): Boolean

Vrifiez s'il est vrai que l'ensemble Set{2..8} contient un seul lment dont le carr appartient aussi l'ensemble

isUnique(variables | expression): Boolean

? Set{0..10}->isUnique(x | 2*x + 1) ? Set{-4..4}->isUnique(x | x*x)

any(variables | expression): T

? let ens=Set{2..9} in ens->any(x | ens->includes(x*x))

collect(variables | expression)

? Set{'bonjour','bonsoir','bon aprs-midi','bonne nuit'}->collect(x | x.size()) Collecter les terminaisons des diffrentes salutations (ce qui vient aprs 'bon')

INF3140 - Collections dans OCL

14

3. Set

union(s: Set(T)): Set(T)

L'union avec l'ensemble s ? Set{1..4}->union(Set{3..6}) ? Set{1..4}->union(Set{'bonjour','bonsoir'})

union(s: Bag(T)): Bag(T)

? Set{1..4}->union(Bag{3..6})

=(s: Set(T)): Boolean

? Set{1,2,3,4} = Set{1,3,2,4} ? Set{1,2,3,4} = Bag{1,3,2,4}

intersection(s: Set(T)): Set(T)

? Set{1..10}->intersection(Set{6..12})

intersection(b: Bag(T)): Set(T)

On traite b comme (convertit b ) un ensemble

? Set{1..10}->intersection(Bag{6,6,7..12})

crivez l'intersection en utilisant select

INF3140 - Collections dans OCL

15

Oprations de Set

-(s: Set(T)): Set(T)

Les lments de self qui ne sont pas dans s ? Set{1..4} Set{3..6} ? Set{1..4} - Set{6..8}

including(obj: T): Set(T)

self, auquel on rajoute obj ? Set{1..4}->including(5) ? Set{1..4}->including('Bonjour') ? Set{1..4}->including(Set{5})

excluding(obj: T): Set(T)

self sans obj

symmetricDifference(s: Set(T)): Set(T)

(self - s) union (s - self) ? Set{1..10}->symmetricDifference(Set{6..15}) ? Set{1..10}->symmetricDifference(Set{11..20}) a donne quoi quand les ensembles sont disjoints?

INF3140 - Collections dans OCL

16

Oprations de Set (suite)

flatten(): Set(T)

Si les lments de l'ensemble (self) ne sont pas du type collection, on retourne une copie de self, sinon, on retourne un ensemble contenant les lments des lments de self ? Set{1..4}->flatten()

? Set{Set{1..2},Set{3..4}, Set{5}}->flatten()
? Set{Set{1..2},Set{3..4}, Set{Set{5},Set{6}}}->flatten()

asSet(): Set(T)

Copie de self

L'opration asSet() est supporte par toutes les collections

asBag(): Bag(T)

Copie de self en tant que Bag

asSequence(): Sequence(T)

Copie de self en tant que Sequence(T)

asOrderedSet(): OrderedSet()

Copie de self en tant que OrderedSet(T) INF3140 - Collections dans OCL

17

4. OrderedSet

append(obj: T): OrderedSet(T)

Ajoute obj la fin ?OrderedSet{1..5}->append(0) ?OrderedSet{1..5}->append('inf3140')

prepend(obj: T): OrderedSet(T)

Ajoute au dbut ? OrderedSet{1..5}->prepend(12)

insertAt(index: Integer, obj: T): OrderedSet(T)

Insre obj la position index, dcalant les lments de index size() de 1 ?OrderedSet{1..5}->insertAt(3,'Coucou!')

subOrderedSet(debut: Integer, fin: Integer): OrderedSet(T)

Retourne le sous-ensemble contenant les lments de position debut fin, compris ? OrderedSet{1..10}->subOrderedSet(3,7) ? OrderedSet{1..10}->subOrderedSet(3,12) ? OrderedSet{1..10}->subOrderedSet(11,15)

INF3140 - Collections dans OCL

18

OrderedSet (suite)

at(index: Integer): T

Retourne l'lment la position index, Undefined, sinon ?OrderedSet{1..5}->at(3) ?OrderedSet{1..5}->at(8)

indexOf(obj: T): Integer

Retourne la position de obj dans le OrderedSet. Si obj n'en fait pas partie, a retourne Undefined ? OrderedSet{1..5}->indexOf(3) ? OrderedSet{1..5}->indexOf(8)

first(): T

Premier lment. Si self est vide, Undefined du bon type ?OrderedSet{1..5}->first() ?OrderedSet{}->first() ?let ens: OrderedSet(Integer) = OrderedSet{} in ens->first()

last(): T

Dernier lment. Si self est vide, Undefined du bon type

INF3140 - Collections dans OCL

19

5. Bag

=(bag: Bag(T)): Boolean

Retourne vrai si bag contient le mme nombre d'lments, le mme nombre de fois ? Bag{1,1,1,2,2,3} = Bag{1,2,3,2,1,1} ? Bag{1,1,1,2,2,3} = Bag{1,2,3} ? Bag{1,2,3} =Set{1,2,3} ? Bag{1,2,3} =Set{1,2,3}->asBag()

union(bag: Bag(T)): Bag(T)

Retourne l'union des deux, en additionnant le nombre d'occurrences des lments ? Bag{1,2,2,3,3,3}->union(Bag{1,2,3})

union(set: Set(T)): Bag(T) T

Retourne l'union des deux, traitant l'argument comme Bag ? Bag{1,2,2,3,3,3}->union(Set{1,2,3})

intersection(bag: Bag(T)): Bag(T)

Retourne l'intersection (au sens ensembliste) des deux, en prenant le minimum du nombre d'occurrences ?Bag{1,2,2,3,3,3,4,4,4,4}->intersection(Bag{2,3,3,4,4,4,4,4,5,5})

INF3140 - Collections dans OCL

20

Bag (suite)

intersection(set: Set(T)): Set(T)

Revient faire l'intersection ensembliste, entre self, asSet(), et set ?Bag{1,2,2,3,3,3,4,4,4,4}->intersection(Set{2,3,4,5})

including(obj: T): Bag(T)

Retourne self plus obj. Si obj tait dj inclus, ceci rajoute une occurrence de plus

excluding(obj: T): Bag(T)

Retourne le Bag consistant en self, moins toutes les occurrences de obj ? Bag{1,2,2,3,3,3}->excluding(3)

count(obj: T): Integer

Retourne le nombre d'occurrence de obj

flatten(): Bag(T2)

Si les lments de self sont des Collection(T2), retourne un Bag contenant les lments des lments de self ? Bag{Set{1,2,3},Bag{4,5},Sequence{6,7,8}}->flatten ?Bag{Bag{1,2},Bag{3.5,4.5}}->flatten ?Bag{Bag{1,2},Bag{3.5,4.5},Bag{'bonjour','bonsoir'}}->flatten Conformance de types!!

INF3140 - Collections dans OCL

21

Bag (suite)

asBag(): Bag(T)

Copie de self Mthode fournie pour que tous les types de collection puisse supporter la mthode asBag()

asSequence(): Sequence(T)

Retourne une Sequence des lments de self odans un ordre non-dtermin ? Bag{1,2,2,3,3,3}->asSequence ? Bag{3,2,3,1,2,3}->asSequence ? Bag{'bonsoir','bonjour','bonsoir'}->asSequence

asSet(): Set(T)

Retourne self, en tant que Set: toutes les occurrences rduites 1

asOrderedSet():OrderedSet(T)

Retourne les lments de self, dans un ordre non-dtermin, en enlevant les occurrences multiples ? Bag{1,3,3,3,2,2}->asOrderedSet()

INF3140 - Collections dans OCL

22

6. Sequence

Sequence: comme un Bag, sauf que l'ordre d'occurrence est important:

?Sequence{1,2} = Sequence{2,1} ? Bag{1,2} = Bag{2,1}

count(object: T): Integer

Retourne le nombre d'occurrences de l'objet

=(s: Sequence(T)): Boolean

Retourne vrai si on retrouve les mmes lments, dans le mme ordre.

union(s: Sequence(T)): Sequence(T)

Retourne self suivie de s ? Sequence{1,3,4}->union(Sequence{5,6,7})

flatten(): Sequence(T2)

Si les lments de self sont des Collection(T2), retourne une Sequence contenant les lments des lments de self

append(object: T): Sequence(T)

Retourne une sequence consistant en self + object la fin

prepend(object: T): Sequence(T)

Retourne une sequence consistant en object + self

INF3140 - Collections dans OCL

23

Sequence (suite)

insertAt(index: Integer, object: T) : Sequence(T)

Retourne une copie de self avec object insr l'indice index

subSequence(debut: Integer, fin: Integer): Sequence(T)

Retourne la squence correspondant self, entre les indices debut et fin, compris

at(i: Integer): T

Retourne l'lment la position i

indexOf(object:T): Integer

Retourne l'index de la premire occurrence de object

first(): T

Retourne le premier

last():T

Retourne le dernier

including(object: T); Sequence(T)

Une copie de self avec object ajout la fin (quivalent de append)

excluding(object: T): Sequence(T)

Une copie de self moins toutes les occurrences de object

INF3140 - Collections dans OCL

24

Sequence (suite)

asBag(): Bag(T)

Copie de self en tant que Bag

asSequence( T) : Sequence(T)

Retourne une copie de self

asSet(): Set(T)

Copie de self en tant que Set (sans doublons)

asOrderedSet(): OrderedSet(T)

Copie de self en tant que OrderedSet, dans le mme ordre que self, sans doublons

INF3140 - Collections dans OCL

25

7. Opration iterate

Un itrateur gnrique sur les collections Forme gnrique

collection->iterate(element: T1; accumulateur: T2 [= valeur-initiale] | expression-mettant-ajouraccumulateur-avec-element) ? Set{1,2,3,4,5,6}->iterate(element; total: Integer = 0 | total + element) ? Set{1,2,3,4,5,6}->iterate(element; max: Integer = 0 | if element > max then element else max endif) Nombre d'lments impairs dans un ensemble

? Set{1..10}->iterate(ele;nbrImpairs: Integer = 0 | if (ele.mod(2)=1) then nbrImpairs+1 else nbrImpairs endif)

Sous-ensemble d'lments impairs

? Set{1..10}->iterate(ele; impairs: Set(Integer) = Set{} | if (ele.mod(2)=1) then impairs->including(ele) else impairs endif)

INF3140 - Collections dans OCL

26

8. Exemples

On peut dcrire la smantique des oprations sur les collections de OCL ... avec OCL!

Post-conditions

Les oprations sur les collections produisent toujours une valeur, sans modifier l'objet initial Cette valeur est reprsente par la valeur/variable result La collection source est reprsente par la variable self On peut faire rfrence aux arguments de la fonction par nom INF3140 - Collections dans OCL

27

Exemples (suite)

Exemples:

Pour le type Collection

includes(object: T): Boolean


post: (self->count(object) > 0) excludes(object: T): Boolean

post: (self->count(object) = 0)

includesAll(col: Collection(T)):Boolean post: col->forAll(elem | self->includes(elem)) isEmpty(): Boolean


post: result = (self->size() = 0)

INF3140 - Collections dans OCL

28

Exemples (suite)

Exemples:

Pour le type Set

union(s: Set(T)): Set(T)


post: result->forAll(elem | self->includes(elem) or s->includes(elem)) post: self->forAll(elem | result->includes(elem)) post: s->forAll(elem | result->includes(elem)) including(object: T): Set(T)

post: result->forAll(elem | self->includes(elem)) post: self->forAll(elem | result->includes(elem)) post: result->includes(object)

INF3140 - Collections dans OCL

29

Exemples (suite)

faire

Pour le type Collection


size(): Integer excludesAll(col: Collection(T)): Boolean notEmpty(): Boolean sum(): T

INF3140 - Collections dans OCL

30

Exemples (suite)

faire

Pour le type Set


union(s: Set(T)): Set(T) intersection(s: Set(T)): Set(T) -(s: Set(T)): Set(T) excluding(object: T): Set(T) count(object: T): Integer

INF3140 - Collections dans OCL

31

Exemples (suite)

faire: une vraie mchante

Pour le type Collection

product(c2: Collection(T2)): Set(Tuple(first: T, second: T2))

Essayez-la sur quelques exemples pour bien comprendre ce qu'elle fait Quelque chose me dit qu'il y a des iterates ;-)

INF3140 - Collections dans OCL

32