Object Constraint Language: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Riga 50:
:<code>antenati=genitori->union(genitori.antenati->asSet())</code>
 
Quest'ultimo vincolo mostra come OCL consenta una applicazione insolita della dot notation della forma ''<nowiki><collezione>.<attributo></nowiki>''; questa espressione ritorna l'insieme di tutti idei valori dellche l'attributo specificato diassume tuttinei glivari elementi della collezione. Nel caso <code>genitori.antenati</code> si tratterebbe di un insieme di insiemi. Per ricondurlo a un insieme semplice, viene usato l'operatore <code>->asSet</code>.
 
===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 è un'operazione che deve essere immediatamente prima dell'esecuzione di una operazione (e quindi corrisponde anche a una ''guardia'' in uno [[Statechart Diagram|diagramma degli stati]]). Una postcondizione è un'operazione che deve essere vera al termine dell'esecuzione di un'operazione. Precondizioni e postcondizioni sono esprimibili formalmente anche in molti [[linguaggio di programmazione|linguaggi di programmazione]], e possono avere sia funzioni di [[debug]] che concorrere alla semantica del [[programma]]: vedi [[assezioni in Java]].
 
:<code><b>context</b>Persona::sposa(p:Persona) <b>pre:</b><br></code>
:<code>coniuge->size()=0</code>
 
:<code><b>context</b>Persona::sposa(p:Persona) <b>post:</b><br></code>
:<code>coniuge=p and p.coniuge=self</code>
 
Nell'indicazione del contesto di questi due vincoli viene indicata una specifica operazione della classe Persona, per la quale si indica che una precondizione (introdotta dalla parola chiave <code>pre</code>) per l'operazione di sposare una persona <code>p</code> è non essere sposati (la "numerosità" dell'attributo <code>coniuge</code> dev'essere 0; in molti linguaggi questo si esprimerebbe dicendo che <code>coniuge</code> è ''[[null]]''). La postcondizione (<code>post</code>è che <code>p</code> diventerà il mio coniuge e io (identificato dalla parola chiave <code>self</code>, che corrisponde al <code>this</code> di molti linguaggi) sono il coniuge della persona che ho sposato.
 
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.
<!-- 16 -->
 
===Informazioni aggiuntive===
I vincoli OCL possono essere corredati di altre caratteristiche che non concorrono alla loro semantica ma contribuiscono alla loro [[leggibilità]]. I [[commento|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><b>context</b> Persona::sposa(p:Persona) <b>pre monogamia:</b><br></code>
:<code>coniuge->size()=0</code>
 
==Voci correlate==