Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2008-9
OCL ha 4 tipi di base predefiniti (i soliti), con relative operazioni:
operazioni su valori Boolean, con valore di ritorno Boolean :
or
b
and
b
xor
b
not
a
=
b
<>
b
implies
b
operazioni standard di Integer e Real :
=
b
Boolean
<>
b
Boolean
<
b
Boolean
>
b
Boolean
<=
b
Boolean
>
b
Boolean
+
b
Integer
or Real
-
b
Integer
or Real
*
b
Integer
or Real
/
b
Real
.mod(b)
Integer
.div(b)
Integer
.abs()
Integer
or Real
.max(b)
Integer
or Real
.min(b)
Integer
or Real
.round()
Integer
.floor()
Integer
sequenza finita di caratteri fra apici:
'ad esempio questa stringa'
operazioni standard di String, dove s, t sono di tipo String, e m, n sono di tipo Integer:
.concat(t)
String
.size()
Integer
.toLower()
String
.toUpper()
String
.substring(m,n)
String
=
t
Boolean
<>
t
Boolean
per ridurre il numero di parentesi: precedenza fra operatori OCL
in ordine decrescente:
::@pre., ->, ^, ^^-,
not*, /+, -<, >, <=, >=, <>, =and, or, xorimpliesoperatori (binari) infissi:
+, -, *, /, <, >, <=, >=, <>, =,
and, or, xor, implies
N.B.: solo la forma infissa di questi operatori è ammessa
tipi definiti dall'utente: quelli presenti in elementi del modello
le loro caratteristiche:
attributi e operazioni sono utilizzabili in espressioni OCL
estremi di associazioni: v. appresso
uso di estremi di associazioni (o di nomi di classi associate, per estremi anonimi):
.
o ->
a seconda delle molteplicità nel percorso
.
e ->
oggetto.navigazione[valoreQual,...]
tipi enumerativi:
<<enumeration>>
Tipo::idValore
un supertipo astratto Collection
4 (sotto)tipi concreti: Set, Bag, OrderedSet, Sequence
questi ereditano dal supertipo:
i tipi collezione sono polimorfi:
definite dal supertipo astratto Collection, dove
->count(e)
Integer
->excludes(e)
Boolean
->excludesAll(s)
Boolean
->includes(e)
Boolean
->includesAll(s)
Boolean
->isEmpty()
Boolean
->notEmpty()
Boolean
->size()
Integer
->sum()
Integer
o Real
o ...
operazioni varianti su sottotipi di Collection, dove
compatibilidi elementi dello stesso tipo
Set
OrderedSet
Bag
Sequence=
Y
Y
Y
Y<>
Y
Y
Y
Y-
Y
Y
-
-->asBag()
Y
Y
Y
Y->asOrderedSet()
Y
Y
Y
Y->asSequence()
Y
Y
Y
Y->asSet()
Y
Y
Y
Y->excluding(e)
Y
Y
Y
Y->including(e)
Y
Y
Y
Y->flatten()
Y
Y
Y
Y->union(s)
Y
Y
Y
Y->intersection(s)
Y
-
Y
-->symmetricDifference(s)
Y
-
-
-le seguenti operazioni sono definite solo su collezioni ordinate, dove
OrderedSet
Sequence->append(e)
Y
Y->at(i)
Y
Y->first()
Y
Y->indexOf(e)
Y
Y->insertAt(i,e)
Y
Y->last()
Y
Y->prepend(e)
Y
Y->subOrderedSet(l,u)
Y
-->subSequence(l,u)
-
Yhanno un body parameter : un'espressione OCL da valutare su ogni elemento della collezione
possono avere un altro parametro, la variabile d'iterazione, riferita all'elemento su cui si valuta il body, e che può occorrere nel body
opname(E ), oppure
opname(v
|
E )
nella forma sintattica più semplice, eccole di seguito, dove
<
any(B )
collect(E )
collectNested(E )
exists(B ), forAll(B )
isUnique(E )
iterate(...) (v. appresso)
one(B )
select(B ), reject(B )
sortedBy(O )
è la più generale delle operazioni iterative
sintassi:
c->iterate(element:Type1; result:Type2 = <expression>
| <expression-with-element-and-result>)
esempi:
se c è di tipo
Collection(Integer):
c->sum() = c->iterate(i:Integer; somma:Integer = 0 | somma + i)
per ogni collezione
c di tipo
Collection(t) ed espressione booleana
B(x),
con x:t
c->forAll(B(x)) = c->iterate(e:t; r:Boolean = true | r and B(e))
per qualsiasi tipo concreto di collezione
CT (uno dei 4 sottotipi di
Collection),
per ogni collezione
c di tipo
CT(t) ed espressione booleana
B(x),
con x:t
c->select(B(x)) = c->iterate(e:t; r:CT(t) = CT{}
| if B(e) then r->including(e) else r endif
@pre
result
oclIsNew() su oggetto
^ (hasSent), booleano:
oggetto^messaggio(...) = true
sse l'istanza contestuale ha inviato
messaggio(...) a
oggetto durante l'esecuzione dell'operazione
^^ (messaggi):
oggetto^^pattern_messaggio(...)
dà la sequenza di messaggi
(oggetti del tipo predefinito
OclMessage),
inviati a
oggetto dall'istanza contestuale durante l'esecuzione dell'operazione,
che corrispondono al
pattern_messaggio(...)
conversione di tipo: detta anche casting
e è di tipo
t1, e
t2 è un sottotipo di
t1, allora la conversione di tipo per
e può effettuarsi con la meta-operazione OCL
oclAsType(t:Type) che ha un tipo come parametro:
e.oclAsType(t2)
conformità di tipo: cf. principio di sostituzione (di Liskov)
t2 è un sottotipo di
t1, allora è conforme a
t1
t2 è conforme a
t1, allora
Collection(t2) è conforme a
Collection(t1), e
CT(t2) è conforme a
CT(t1) per i 4 sottotipi concreti
CT di
Collection
Collection non sono conformi fra loro
OclAny : il tipo universale in OCL