Professional Documents
Culture Documents
Hafedh MILI
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
Dcrire les types de collections dans OCL S'exercer sur les collections avec USE
T
OrderedSet
Les collections de OCL sont gnriques, i.e. paramtres par le type d'lments dans la collection
Lorsqu'on dclare une variable du type collection, le type des lments est:
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
Oprations implantes par toutes les collections, mais de faon lgrement diffrente
size(): Integer
includesAll(col: Collection(T)):Boolean
Retourne vrai si tous les lments de l'argument sont inclus dans la collection
Retourne vrai si aucun des lments de col n'est inclus dans la collection
INF3140 - Collections dans OCL 7
isEmpty(): Boolean
notEmpty(): Boolean
sum(): T
Retourne la somme des lments de la collection. S'applique aux collections de Integer et Real
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
Retourne vrai si l'expression est vrai pour toutes les valeurs de 'variables' prises dans la collection
Retourne vrai s'il existe au moins une valeur possible des variables prises dans la collection pour laquelle expression est vraie
Retourne vrai s'il existe exactement une valeur des variables prises dans la collection pour laquelle expression est vraie
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 sous-collection (de mme type que self) qui contient les lments pour lesquels le prdicat est vrai
Retourne la sous-collection (de mme type que self) qui contient les lments pour lesquels le prdicat est vrai
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
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()
? 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)
11
Exemples (suite)
? Set{1..4}->count(3) ? Bag{1..4,1..4}->count(2)
includesAll(col: Collection(T)):Boolean
? Set{1..4}->excludesAll(Set{3..5}) ? Set{1..4}->excludesAll(Set{5..8})
12
Exemples (suite)
isEmpty(): Boolean
sum(): T
394 :-)
13
Exemples (fin)
Vrifiez s'il est vrai que l'ensemble Set{2..8} contient un seul lment dont le carr appartient aussi l'ensemble
any(variables | expression): T
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')
14
3. Set
? Set{1..4}->union(Bag{3..6})
? Set{1..10}->intersection(Set{6..12})
? Set{1..10}->intersection(Bag{6,6,7..12})
15
Oprations de Set
Les lments de self qui ne sont pas dans s ? Set{1..4} Set{3..6} ? Set{1..4} - Set{6..8}
(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?
16
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
asBag(): Bag(T)
asSequence(): Sequence(T)
asOrderedSet(): OrderedSet()
17
4. OrderedSet
Insre obj la position index, dcalant les lments de index size() de 1 ?OrderedSet{1..5}->insertAt(3,'Coucou!')
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)
18
OrderedSet (suite)
at(index: Integer): T
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
19
5. Bag
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()
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})
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})
20
Bag (suite)
Retourne self plus obj. Si obj tait dj inclus, ceci rajoute une occurrence de plus
Retourne le Bag consistant en self, moins toutes les occurrences de obj ? Bag{1,2,2,3,3,3}->excluding(3)
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!!
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)
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()
22
6. Sequence
flatten(): Sequence(T2)
Si les lments de self sont des Collection(T2), retourne une Sequence contenant les lments des lments de self
23
Sequence (suite)
Retourne la squence correspondant self, entre les indices debut et fin, compris
at(i: Integer): T
indexOf(object:T): Integer
first(): T
Retourne le premier
last():T
Retourne le dernier
24
Sequence (suite)
asBag(): Bag(T)
asSequence( T) : Sequence(T)
asSet(): Set(T)
asOrderedSet(): OrderedSet(T)
Copie de self en tant que OrderedSet, dans le mme ordre que self, sans doublons
25
7. Opration iterate
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; impairs: Set(Integer) = Set{} | if (ele.mod(2)=1) then impairs->including(ele) else impairs endif)
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:
post: (self->count(object) = 0)
28
Exemples (suite)
Exemples:
29
Exemples (suite)
faire
30
Exemples (suite)
faire
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
31
Exemples (suite)
Essayez-la sur quelques exemples pour bien comprendre ce qu'elle fait Quelque chose me dit qu'il y a des iterates ;-)
32