Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2007-8
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:
in ordine decrescente:
::
@pre
., ->, ^, ^^
-
,
not
*, /
+, -
<, >, <=, >=, <>, =
and, or, xor
implies
operatori (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, in assenza di nomi di estremi):
.
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