Object Constraint Language: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti. |
||
(42 versioni intermedie di 23 utenti non mostrate) | |||
Riga 1:
L''''Object Constraint Language''' o '''OCL''' è un [[Linguaggio formale
OCL deriva da un linguaggio precedente noto come [[Syntropy]]. Il nucleo di OCL può essere descritto come un linguaggio mutuato dal [[Calcolo dei predicati|calcolo dei predicati del primo ordine]] per l'espressione di condizioni logiche inerenti
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 [[diagramma|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
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>età>=0</code>
La
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]]'':
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>età>=0 and età<padre.età</code>
Questa regola arricchisce la precedente con un ulteriore vincolo (legato da un [[
=== Invarianti su collezioni ===
Gli attributi con molteplicità maggiore di 1 (ovvero che rappresentano [[insieme|insiemi]]), detti ''collezioni'', possono essere manipolati in OCL con un insieme di [[operatore (informatica)|operatori]] specifici. Anche un attributo con molteplicità 1 ma trattato come collezione può essere manipolato con i seguenti operatori.
L'operatore <code>->size()</code> fornisce la numerosità di una collezione. La seguente regola indica che ogni persona ha due genitori:
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>genitori->size()=2</code>
L'operatore <code>->forAll</code> 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:
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>genitori->size()=2 and genitori->forAll(genitore:Persona | età<genitore.età)</code>
Il [[quantificatore esistenziale]] è rappresentato dall'operatore <code>->exists</code>. Questo operatore ritorna un valore [[logica booleana|booleano]] (''vero'' o ''falso'') a seconda che nella collezione esista almeno
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>genitori->size()=2 and genitori->exists(sesso=m) and genitori->exists(sesso=f)</code>
Riga 42:
:<code>collezione->exists(condizione)</code>
:<code>collezione->select(condizione)->size()>0</code>
L'operatore <code>->includes</code> torna invece un valore booleano a seconda che una certa collezione includa o meno un determinato oggetto, e l'operatore <code>->excludes</code> verifica la condizione opposta. Vi sono poi operatori che rappresentano operazioni insiemistiche, come <code>->union</code> ([[unione (insiemistica)|unione]]).
:<code>'''context''' Persona '''inv:'''<br /></code>
:<code>antenati=genitori->union(genitori.antenati->asSet())</code>
Quest'ultimo vincolo mostra come OCL consenta
=== Precondizioni e postcondizioni ===
OCL consente di descrivere (parzialmente o completamente) la semantica di un'operazione di una classe per mezzo di ''precondizioni'' e ''postcondizioni''. Una precondizione è una condizione che deve essere vera immediatamente prima dell'esecuzione di
:<code>'''context''' Persona::sposa(p:Persona) '''pre:'''<br /></code>
:<code>coniuge->size()=0</code>
:<code>'''context''' Persona::sposa(p:Persona) '''post:'''<br /></code>
:<code>coniuge=p and p.coniuge=self</code>
Riga 65:
Nelle espressioni per le postcondizioni si possono usare alcuni simboli speciali dedicati. La parola chiave <code>result</code> indica il valore tornato dall'operazione. Il simbolo <code>@pre</code>, applicato al nome di un attributo, si riferisce al valore che l'attributo aveva ''prima'' che fosse eseguita l'operazione.
=== Regole di derivazione e query ===
Un'espressione OCL può essere usata anche per descrivere il valore di un attributo derivato di una classe. Per esempio, le seguenti regole specificano chi sono rispettivamente i ''suoceri'' e i ''consuoceri'' di una persona:
:<code>'''context''' Persona::suoceri:Set(Persona) '''derive:'''<br /></code>
:<code>coniuge.genitori</code>
:<code>'''context''' Persona::consuoceri:Set(Persona) '''derive:'''<br /></code>
:<code>figli.coniuge->asSet().genitori->asSet()</code>
Estremamente simile a un attributo derivato è una ''query'', ovvero
:<code>'''context''' Persona::suoceri():Set(Persona) '''body:'''<br /></code>
:<code>coniuge.genitori</code>
=== Valori iniziali di attributi ===
Un'espressione OCL può essere usata anche per descrivere il valore iniziale di un attributo:
:<code>'''context''' Persona::età:Integer '''init:'''<br /></code>
:<code>0</code>
=== Informazioni aggiuntive ===
I vincoli OCL possono essere corredati di altre caratteristiche che non concorrono alla loro semantica ma contribuiscono alla loro [[leggibilità]]. I [[commento (informatica)|commenti]] sono introdotti dai caratteri <code>--</code>, e si intendono proseguire fino alla fine della linea. I vincoli possono essere dotati di un nome, composto da una singola parola (senza spazi) posta dopo la parola chiave <code>inv</code>, <code>pre</code> ecc:
:<code>'''context''' Persona::sposa(p:Persona) <b>pre</b> monogamia:<br /></code>
:<code>coniuge->size()=0</code>
=== Tipi e operatori predefiniti ===
Le espressioni OCL possono contenere riferimenti a quattro [[tipo primitivo|tipi primitivi]], definiti anche per UML: <code>Integer</code> ([[numeri interi]]), <code>Real</code> ([[numeri reali]]), <code>String</code> ([[stringa (informatica)|stringhe]]), <code>Boolean</code> (valori [[algebra di Boole|booleani]]). Su tali tipi primitivi sono definiti un vasto assortimento di operatori.
I seguenti operatori si applicano ai tipi numerici Integer e Real:
{| class="wikitable"
|-
| uguaglianza
Riga 151:
| a'''.abs'''
| Integer o Real
|-▼
| Boolean▼
|-
| massimo
Line 174 ⟶ 170:
I seguenti operatori si applicano al tipo Boolean:
{| class="wikitable"
|-
| or logico (OR)
Line 214 ⟶ 210:
I seguenti operatori si applicano al tipo String:
{| class="wikitable"
|-
| concatenazione
Line 238 ⟶ 234:
| a'''.substring('''n, m''')'''
| String
▲|-
| esistenza carattere all'interno della stringa (da A a Z)
| a'''.exists('''c ┃ c = [A, ..., Z]''')'''
▲| Boolean
|-
| uguaglianza
Riga 248:
|}
== Tool ==
La maggior parte dei tool e degli [[Integrated development environment|ambienti integrati]] per la modellazione in UML non gestiscono ancora OCL, o lo gestiscono in modo solo parziale. Molti dei tool elencati qui di seguito non sono integrati in ambienti di modellazione UML.
* [[Model Run]] ([[Borland]], {{collegamento interrotto|1=[http://www.borland.com/company/boldsoft.html/products/modelrun/modelrun.html] |data=marzo 2018 |bot=InternetArchiveBot }}), attualmente incluso in [[Borland Delphi 7 Studio Architect]]
* [[OCL Compiler]] ([[Cybernetic Intelligence GMBH]], [https://web.archive.org/web/20191227145653/http://www.cybernetic.org/]), un analizzatore di espressioni OCL, con diversi front-end per l'integrazione in ambienti UML come [[Rational Rose]]
* [[OCLCUD]] ([[Università tecnica di Dresda|Università di
* [[Octopus]] ([[Klasse Objecten]], [http://www.klasse.nl/ocl/octopus-intro.html] {{Webarchive|url=https://web.archive.org/web/20050208013427/http://www.klasse.nl/ocl/octopus-intro.html |data=8 febbraio 2005 }}). Supporta completamente l'ultima versione di OCL, 2.0. Creato dagli autori di OCL.
==
* Il linguaggio [[Eiffel (linguaggio)|Eiffel]] fu uno dei primi [[linguaggio di programmazione|linguaggi]] [[Programmazione orientata agli oggetti|object-oriented]] a includere un sottolinguaggio dichiarativo per esprimere [[asserzione (informatica)|asserzioni]]
*
* [[Syntropy]], [[Catalysis]] e
▲* [[Syntropy]], [[Catalysis]] e [[BON]] sono altri linguaggi che consentono di esprimere vincoli su sistemi a oggetti
* L'uso di precondizioni, postcondizioni e invarianti come strumenti di specifica di dati e operazioni ha origine negli studi sulla [[semantica assiomatica]] di [[C.A.R. Hoare]] e [[Edsger Dijkstra]].
== Bibliografia ==
* [[Jos B. Warmer]], [[Anneke G. Kleppe]]. ''[[The Object Constraint Language: Precise Modeling with UML]]'' ([[Addison-Wesley]] [[Object Technology Series]]
== Collegamenti esterni ==▼
▲* [[Jos B. Warmer]], [[Anneke G. Kleppe]]. ''[[The Object Constraint Language: Precise Modeling with UML]]'' ([[Addison-Wesley]] [[Object Technology Series]] [[1998]]), ISBN 0201379406
* [https://web.archive.org/web/20110807045309/http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML Specifiche di UML] (includono la specifica di OCL)▼
* [https://web.archive.org/web/20060220003552/http://www.parlezuml.com/tutorials/umlforjava/java_ocl.pdf Tutorial su OCL per
* [http://www.klasse.nl/ocl/index.html Varie risorse su OCL] {{Webarchive|url=https://web.archive.org/web/20060515052915/http://www.klasse.nl/ocl/index.html |data=15 maggio 2006 }} nel sito di [[Jos Warmer]] e [[Anneke Kleppe]], ideatori di OCL▼
* {{cita web | 1 = http://www.deepthought.com.au/it/ocl_review.html | 2 = Una revisione critica di OCL | accesso = 5 maggio 2006 | urlarchivio = https://web.archive.org/web/20060505175435/http://www.deepthought.com.au/it/ocl_review.html | dataarchivio = 5 maggio 2006 | urlmorto = sì }}
* {{cita web | 1 = http://projekte.fast.de/Projekte/forsoft/ocl/4_1Equivalence_OCL_relation.html | 2 = Confronto fra OCL e calcolo relazionale | accesso = 7 maggio 2006 | urlarchivio = https://web.archive.org/web/20070313123733/http://projekte.fast.de/Projekte/forsoft/ocl/4_1Equivalence_OCL_relation.html | dataarchivio = 13 marzo 2007 | urlmorto = sì }}
{{Linguaggi di interrogazione}}
▲==Collegamenti esterni==
▲* [http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML Specifiche di UML] (includono la specifica di OCL)
▲* [http://www.parlezuml.com/tutorials/umlforjava/java_ocl.pdf Tutorial su OCL per [[Java (linguaggio)|Java]]], con informazioni molto complete sulla sintassi OCL
▲* [http://www.klasse.nl/ocl/index.html Varie risorse su OCL] nel sito di [[Jos Warmer]] e [[Anneke Kleppe]], ideatori di OCL
[[Categoria:UML]]
[[Categoria:
|