Object Constraint Language
L'Object Constraint Language o OCL è un linguaggio di specifica formale inizialmente proposto come estensione per il linguaggio di modellazione object-oriented UML e successivamente (2003) entrato a far parte del nuovo standard del linguaggio (UML 2.0). OCL può essere impiegato insieme a qualunque metamodello basato su MOF. Inoltre, OCL è un elemento chiave del nuovo standard per la trasformazione di modelli di OMG, QVT, e fa parte della famiglia di standard che compongono la Model Driven Architecture.
OCL deriva da Syntropy. Il nucleo di OCL può essere descritto come un linguaggio mutuato dal calcolo dei predicati del primo ordine per l'espressione di condizioni logiche inerenti lo stato e le operazioni di oggetti in un contesto object-oriented. Con la potenza del calcolo dei predicati, OCL consente di descrivere invarianti che legano il valore degli attributi di una classe, precondizioni e postcondizioni delle operazioni, e via dicendo. A partire dalla versione 2.0 (che è quella inclusa nello standard UML), il linguaggio è stato arricchito di elementi che consentono di descrivere la semantica di operazioni di tipo interrogazione (query), ovvero prive di effetti collaterali.
Gran parte delle informazioni che si possono descrivere in OCL non sono esprimibili in nessun altro modo formale nel contesto di UML (ovvero non possono essere rappresentate dai diagrammi UML).
Descrizione
Invarianti semplici
In genere, in UML, un'espressione OCL è associata a una classe, e descrive proprietà degli oggetti istanze di quella classe. QUeste proprietà sono espresse in forma di condizioni che legano i valori degli attributi, dei parametri, dei valori tornati delle operazioni, e così via. Nel seguente esempio compare un'espressione che fa riferimento a un attributo:
context Persona inv:
età>=0
La parola chiave context</context> precede la dichiarazione della classe a cui questa regola OCL si applica.
inv:
specifica che questa particolare regola è una invariante, ovvero deve essere interpretata come una condizione che è sempre vera, per tutti gli oggetti di classe Persona
. L'espressione che segue dichiara che l'età di una persona è sempre non negativa.
Nel caso in cui un attributo di una classe sia a sua volta un oggetto, è possibile riferirsi ai suoi attributi o metodi utilizzando la dot notation:
context Persona inv:
età>=0 and età<padre.età
Questa regola arricchisce la precedente con un ulteriore vincolo (legato da un and booleano), che specifica che ogni persona è più giovane del proprio padre.
Invarianti su collezioni
Gli attributi con molteplicità maggiore di 1 (ovvero che rappresentano insiemi), detti collezioni, possono essere manipolati in OCL con un insieme di operatori specifici.
L'operatore ->size()
fornisce la numerosità di una collezione. La seguente regola indica che ogni persona ha due genitori:
context Persona inv:
genitori->size()=2
L'operatore ->forAll
corrisponde al quantificatore universale del calcolo dei predicati del primo ordine. La seguente regola rappresenta una sintesi delle precedenti, che specifica che ogni persona ha due genitori ed è più giovane di entrambi:
context Persona inv:
genitori->size()=2 and forAll(genitore:Persona | età<genitore.età)
Voci correlate
- Il linguaggio Eiffel fu uno dei primi linguaggi object-oriented a include un sottolinguaggio dichiarativo per esprimere asserzioni
- Anche Java ha un proprio sottolinguaggio per le asserzioni
- Syntropy, Catalysis e BON sono altri linguaggi che consentono di esprimere vincoli su sistemi a oggetti
Collegamenti esterni
- The Specifica di UML (include la specifica di OCL)
- Tutorial su OCL per Java
- Varie risorse su OCL nel sito di Jos Warmer e Anneke Kleppe, ideatori di OCL
- Una revisione critica di OCL