Object Constraint Language: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m →Bibliografia: Bot: fix overlinking (v. richiesta) |
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti. |
||
(33 versioni intermedie di 17 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 allo stato e alle operazioni di oggetti in un contesto ''object-oriented''. Con la potenza del calcolo dei predicati, OCL consente di descrivere [[
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).
Riga 7:
== 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]]'':
Riga 22:
=== 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:
Riga 34:
:<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>
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]]).
Riga 49:
:<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>
Riga 74:
:<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>
Riga 80:
=== 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>
Riga 86:
=== 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>
Riga 151:
| a'''.abs'''
| Integer o Real
|-▼
| Boolean▼
|-
| massimo
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 251:
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 Dresda]]), [http://dresden-ocl.sourceforge.net]), integrato con [[ArgoUML]]
* [[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]] 1998), ISBN 0-201-37940-6
== Collegamenti esterni ==
* [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
*
*
{{Linguaggi di interrogazione}}
[[Categoria:UML]]
[[Categoria:
|