OCL
Object Constraint Language
LINGUAGGIO DI SPECIFICAZIONE
DI OGGETTI
OCL si può utilizzare in qualche contesto dove si usa il diagrama di
classe che sta associato (per essempio, nel modello concettuale o
disegno).
È un linguaggio ibrido orientato a oggetti-funzionale, ed è tipificato,
perché usa il concetto di tipi di dati.
Gli utenti di UML e di altri linguaggi, possono usare l’OCL per
specificare restrizioni e altri espressioni inserite nei suoi modelli.
OCL ha caratteristiche di un linguaggio d’espressione, di linguaggio
di modellazione e di linguaggio formale.
LINGUAGGIO D’ ESPRESSIONE
È un linguaggio d’espressione puro. Garantisce che la valutazione di
una espressione OCL non avrà effetti collaterali; non può cambiare
niente del modello, ovvero, lo stato del sistema non cambierà mai
come conseguenza di una espressione OCL.
Tutti i valori degli oggetti, inclusi tutti i collegamenti, non possono
cambiare durante la valutazione di una espressione OCL.
Una espressione OCL ritorna semplicemente un valore.
LINGUAGGIO DI MODELLAZIONE
OCL non è un linguaggio di programazione: non è
possibile scrivere logica di programmazione o un flusso
di controllo. Non è possibile invocare processi o attivare
operazioni diverse da query in OCL.
OCL è un linguaggio di modellazione in primo luogo.
Dal momento che OCL è un linguaggio di modellazione,
tutte le considerazioni implementative sono fuori dal suo
dominio e non si possono esprimere con linguaggio OCL.
Concettualmente, ogni espressione OCL è atomica.
LINGUAGGIO FORMALE
OCL è un linguaggio formale dove tutti i construttori hanno un loro
significato formalmente definido, OCL è formalizzato all’interno di
UML.
OCL non pretende di sostituire linguaggi formali come VDM o Z
PERCHÈ OCL E NON ALTRI?
Lo svantaggio dei linguaggi formali tradizionali è che sono pensati
per persone con una forte formazione matematica, ma sono difficili
per il progettista di sistema.
OCL è stato sviluppato per risolvere questo problema.
È un linguaggio formale, facile da leggere e scrivere.
DOVE USARE OCL
OCL si può usare con diversi scopo:
- Specificare caratterische statiche delle classi e dei tipi di un
modello di classe
- Specificare caratterische statiche di tipo per gli Stereotipi
- Specificare pre e post-condizioni sulle Operazioni e i Metodi.
- Come linguaggi di navigazione di alberi (tipo X-Path).
- Specificare restrizioni sulle operazioni (pre e post condizioni).
Può formare parte di una caratteristica statica ovvero una restrizione
stereotipata tramite <<invariant>>.
Può formare parte di pre-condizioni e post-condizioni che sono
restrizioni stereotipate con <<pre-condition>> e <<postcondition>>.
OGGETTI E PROPRIETÀ
Le espressioni OCL si possono riferire a tipi, classi, interfacce,
associazioni (come tipi) e tipi di dati.
Anche a tutti gli attributi, gli end-point di una associazione, metodi e
operazioni che non hanno effetti collaterali.
TIPI PREDEFINITI
Si definiscono all’interno di OCL i tipi di dati base, cosí come le operazioni
che si possono realizare con la siguiente tabella:
TIPO
VALORE
OPERAZIONE
Boolean
True, False
And, Or, Not, Xor
Integer
1, 2, 34,5242…
+, /, abs
Real
1.5, 3.14, 6.78…
+, -, /, floor
String
To be, or, not
toUpper, concat
TIPI DI DEFINIZIONI
Invarianti
Invarianti di metodo/responsabilità
Definizione di attributi derivati
Definizione di metodi/responsabilità derivate
TIPI DI DATI
1. Predefiniti
a) Basici
Boolean
Integer
Real
String
OCLAny
OCLType
b) Strutturati
Collection(T)
Set(T)
Bag(T)
OrderedSet(T)
Sequence
Tuple
2. Non Predefiniti
Sono ogni classe e enumeratore del diagrama delle classi
ESEMPIO DI USO (1)
Faremo un caso pratico.
Nel nostro esempio, andiamo a eseguire espressioni OCL su un classico
diagramma che rappresenta una impresa.
Fase 1: Carga del Modello UML 2.0
Essempio d’empresa generado con eclipse per modelo UML2.0:
<?xml version="1.0" encoding="UTF-8"?>
<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML"
xmi:id="_JsDyAPMHEdmre8WY4HdRjQ" name="testCase1">
<ownedMember xmi:type="uml:Package"
xmi:id="_J6MUoPMHEdmre8WY4HdRjQ" name="Package"
packageableElement_visibility="public">
<ownedMember xmi:type="uml:Class" xmi:id="_J7J98PMHEdmre8WY4HdRjQ"
name="Empleado" isLeaf="false" isAbstract="false" isActive="false"/>
<ownedMember xmi:type="uml:Class" xmi:id="_J7QEkfMHEdmre8WY4HdRjQ"
name="Jefe" isLeaf="false" isAbstract="false" isActive="false"/>
<ownedMember xmi:type="uml:Class"
xmi:id="_J7WLMvMHEdmre8WY4HdRjQ"
name="Ayudante" isLeaf="false" isAbstract="false" isActive="false"/>
</ownedMember>
</uml:Model>
Fase 1: Caricamento del Modello UML 2.0
Nel modello UML 2.0 i collegamenti tra classi sono allo
stesso livello delle classi e dei tipi primitivi.
Riassumendo, le classi sono: dipartamento, compagnia,
persona, impiegato, gruppo.
I tipi base che useremo nel nostro package sono: intero,
lista, boolean e un tipo enumerato (tipo persona)
Fase 2: Esempi di espressioni
a)
Lavoramo in una impresa, la quale necessita di costraint per
essere correttamente rappresentata ad esempio un package non
deve contenere più di 3 elementi
Context Package inv:ownedMember->size()<=3
b)
Tutti I nomi di dipartamenti devono iniziare con una lettera
maiuscola tra la A e la D comprese
Context Department inv:
Set{‘A’,’B’,’C’,’D’}>=includes(name.substring(1,1))
COLLEGAMENTI D’INTERESSE
Inglese: http://www.omg.org/docs/ptc/03-10-14.pdf
Spagnolo: http://www-2.dc.uba.ar/materias/isoft1/is12005_2/apuntes/OCL.pdf
Italiano: http://www.tecnoteca.it/upgrade/aprile_2004
Francese: http://uml.free.fr/cours/p16.html