• Non ci sono risultati.

Di seguito sar`a brevemente trattata la struttura dati del linguaggio ODL; come si potr`a notare tramite questa struttura possono essere rappresentati schemi ad oggetti ma non schemi referenti dati semistrutturati.

4.2.1 Tipi classe e classi valore

L’ODL prevede una fondamentale distinzione dei suoi tipi di dati un due macro-categorie:

• Tipi Valore • Tipi Classe

I tipi semplici vengono impiegati per la dichiarazione di variabili ed attributi sem-plici. La principale distinzione fra questi tipi ed i tipi classe (chiamati pi`u semplice-mente classi ) `e che lo loro non possiedono un identificatore unico ma l’ identit`a `e definita direttamente dal proprio valore. Le istanze dei tipi classe, invece, possiedono tutte un proprio OID (Object IDentifier) che deve essere unico. In pratica l’identit`a di un oggetto complesso `e data dal proprio OID.

4.2.2 I tipi valore

I tipi valore (o valueType) si differenziamo in due distinte categorie:

• SimpleType • ConstrType

4.2.3 I tipi semplici

I simpleType (o tipi semplici) rappresentano i tipi atomici di base. Vi sono diversi tipi semplici predefiniti nel linguaggio ODL; eccone un elenco:

• Boolean • String • Octet • Int • Short • Long

• Float • Double • Char

I tipi Int, Short e Long possono anche essere dichiarati unsigned. Oltre quelli gi`a citati esiste un ulteriore tipo semplice: any. Il tipo any `e il tipo da cui derivano tutti gli altri presenti nel linguaggio ODLI3, sia i tipi valore che quelli classe. Il contenuto di un oggetto any pu`o essere in pratica qualsiasi cosa.

4.2.4 I constrType

La seconda categoria di tipi valore `e quella dei constrType (tipi costrutti) che contiene tre sottocategorie:

• StructType • EnumType • UnionType

Un esempio di definizione di tipo struttura (structType) `e il seguente:

typedef struct nometag { int a;

string b; unsigned long c;

} tipostruct ;

gli elementi contenuti in un tipo struttura devono essere tipi valore. Nometag `e opzionale ed una variabile strutturata come nell’esempio precedente pu`o essere dichiara-ta indipendentemente in due modi distinti:

tipostruct var1 ; struct nometag var2;

si noti che tramite l’utilizzo del termine opzionale nometag le dichiarazioni devono sempre essere accompagnate dall’utilizzo della parola chiave struct. I tipi enumer-azione (EnumType) servono per restringere il campo dei valori possibili di un

enum colore { rosso , nero , bianco , verde , blu };

una variabile di tipo colore potr`a assumere solamente uno dei valori (di tipo stringa) contenuti all’interno dell’elenco fra le parentesi graffe. Il tipo unione, invece, serve per scegliere, in base al valore di una variabile in una clausola switch, il tipo di appartenenza di una variabile.

union NumeroType switch(int ) { case 1: string prova ; case 2: int prova ;

};

Nel precedente esempio NumeroType pu`o essere una stringa di caratteri oppure un intero. Come per il caso del tipo struttura, la variabili che compaiono in un’unione devono essere valueType e non tipi classe.

4.2.5 I tipi collezione

I tipi semplici sono tutti tipi atomici. Per rappresentare collezioni di dati semplici si sfruttano, appunto, i tipi collezione messi a disposizione dal linguaggio ODL: set,

bag, list e array. I tipi collezione sono anch’essi un sottoinsieme dei tipi valore. Se

si desidera, ad esempio, creare un insieme ordinato di elementi di genere stringa la formulazione `e la seguente:

list < string > ListaDiStringhe ;

Se si desidera, invece, formare una collezione non ordinata di tali elementi si una il termine set:

set < string > SetDiStringhe ;

4.2.6 I tipi classe

In ODL le classi vengono chiamate anche interfacce (interface) ed ognuna di esse `e costituita da due parti fondamentali:

• Interface header • Interface body

Nell’interface header si specifica il nome della classe, le classi da cui eredita (se presenti) ed una lista di propriet`a chiamata typePropertyList. In ODL `e ammissibile l’ereditariet`a multipla: ogni classe pu`o avere, cio`e, una o pi`u superclassi. Per ogni superclasse vengono ereditati tutti gli attributi e tutti i metodi. Nella typePropertyList possono essere specificate propriet`a come l’extent. L’extent rappresenta l’insieme di tutte la istanze di una particolare classe all’interno di un Database. Sempre all’interno di questa lista di propriet`a (che deve essere racchiusa da parentesi tonde) `e possibile definire una chiave (key). Ogni chiave pu`o mappare un singolo attributo presente nel corpo dell’interfaccia (chiave semplice) oppure pu`o mappare un insieme di attributi (chiave composita). La seconda parte di una classe ODL `e data dall’interface body (il corpo dell’interfaccia) che ne descrive la struttura interna (l’insieme di attributi e di metodi che ne fanno parte). Un interface body pu`o essere composto dai seguenti elementi:

• Attributi: gli attributi presenti in una classe (interfaccia) ODL possono essere

sia semplici, sia complessi; nel primo caso il tipo dell’attributo apparterr`a ad un tipo valore (valueType), nel secondo, invece, sar`a un tipo classe

• Relationships: la relazioni possono fare riferimento solamente ad interfacce,

mai a tipi valore. E’ possibile aggiungere inoltre informazioni sulla relazione inversa. In pratica la relationship si pu`o descrivere come un’attributo complesso per cui pu`o esistere la relazione inversa.

• Operazioni: la operazioni rappresentano i metodi della classe, quindi descrivono

il comportamento della classe stessa.

• Costanti: la sintassi della costanti in ODL `e praticamente questa dell’ANSI C:

si deve specificare il nome della costante, il tipo della stessa ( che deve essere un tipo semplice) ed il suo valore.

Un esempio di interfaccia ODL `e il seguente:

interface Indirizzo ( extent Indirizzo )

attribute string Stato ;

attribute string Citt`a ;

attribute string Via;

attribute int Numero;

};

Il corpo dell’interfaccia indirizzo `e formato da quattro attributi (tutti semplici), e nella sua lista di propriet`a (fra parentesi tonde) `e presente l’elemento extent.