Reificazione (informatica)
In informatica, la reificazione è il processo tramite cui un concetto astratto viene trasformato in un modello dei dati o altri oggetti creati tramite un linguaggio di programmazione. Un oggetto computabile/indirizzabile, detto "risorsa", viene creato nel sistema per incapsulare un oggetto non computabile o indirizzabile.
Informalmente, reificare un concetto o comportamento astratti significa renderli un first-class object, come un tipo, un oggetto, un'entità o un valore, ovvero una qualche struttura che supporti le operazioni più comuni, quali l'essere passata come argomento, restituita da una funzione o assegnata ad una variabile.[1]
La reificazione è una tecnica molto comune nel paradigma orientato agli oggetti, in analisi concettuale e nella rappresentazione della conoscenza.
Reificazione e linguaggi riflessivi
[modifica | modifica wikitesto]Nel contesto dei linguaggi di programmazione, la reificazione è il processo tramite cui taluni aspetti del programma o del linguaggio programmazione, che altrimenti sarebbero impliciti nel codice compilato e a tempo di esecuzione, vengono espressi dal linguaggio stesso. Tramite la reificazione, il programma può analizzare tutti questi aspetti come dati ordinari. Nei linguaggi riflessivi, il referente (ovvero la struttura creata tramite reificazione) è causalmente connesso all'aspetto reificato, in modo che una modifica del primo riguardi anche il secondo.
La reificazione, almeno parzialmente, può essere espressa nell'utilizzo di vari linguaggi:
- In C vengono reificati i dettagli di basso livello degli indirizzi di memoria. A differenza di molti altri linguaggi, infatti, la gestione della memoria viene eseguita direttamente nel codice sorgente, per cui sono necessarie tecniche per la gestione dei metadati delle variabili del programma. In particolare, l'indirizzo di memoria viene reificato e reso disponibile per la manipolazione diretta da altri costrutti del linguaggio. Nella seguente linea di codice, ad esempio, viene creato il puntatore
buffer
per permettere di accedere all'indirizzo di memoria 0xB800000:char* buffer = (char*) 0xB800000;
- Il linguaggio Scheme reifica le continuazioni (approximately, the call stack).
- In C#, la reificazione è utilizzata per eseguire il polimorfismo parametrico.
- In Java esistono dei "reifiable types" ("tipi reificabili") che sono "completamente disponibili a tempo di esecuzione" (ovvero, i loro metadati non vengono cancellati durante la compilazione del sorgente)[2]
- Molti linguaggi, come Lisp, JavaScript e Curl, forniscono una procedura chiamata
eval
oevaluate
che reifica a tutti gli effetti l'interprete del linguaggio. Ad esempio, scrivendo uno script JavaScript del tipo:equivale a scriverefor(var i=1; i<=3; i++) eval("document.myform.object"+i+".value=0");
In questo modo, come si può notare è molto semplice manipolare gli oggetti senza utilizzare direttamente i nomi delle variabili, bensì ricavandoli dinamicamente.document.myform.object1.value=0 document.myform.object2.value=0 document.myform.object3.value=0
Reificazione dei dati e refinement
[modifica | modifica wikitesto]Nel metodo formale VDM, la reificazione è detta refinement ("raffinamento"). Il data refinement consiste nel sostituire il tipo di dati astratto usato nella progettazione di un algoritmo o di un sistema con una rispettiva struttura dati concreta.[3]
Reificazione nella modellazione concettuale
[modifica | modifica wikitesto]La reificazione è largamente impiegata nella modellazione concettuale.[4] Reificare una relazione significa rappresentarla come un'entità.
Per esempio, considerando la relazione AppartieneA(membro:Persona, Comitato)
, un'istanza di AppartieneA
rappresenta il fatto che una persona sia membro di un comitato. La figura in basso raffigura un esempio di istanze della relazione in forma tabulare. La reificazione della relazione AppartieneA
consiste nel trasformarla in un'entità Appartenenza
, la quale, tramite due relazioni ad hoc AppartenenzaP
e AppartenenzaC
viene collegata, rispettivamente, alle entità Persona
e Comitato
.
Nel contesto della modellazione dei dati, reificare una relazione è indispensabile quando si vuole trattare la relazione stessa come un'entità. Nell'esempio sopra, l'uso dell'entità Appartenenza
potrebbe servire a definire la relazione che indica quale persona stabilisce l'appartenenza di un'altra persona ad un comitato, ovvero Stabilisce(Persona, Appartenenza)
.
Nel contesto dell'implementazione di una base di dati, la reificazione è necessaria quando la relazione non ha vincoli di cardinalità. Nell'esempio sopra, una persona può essere membro di più comitati, e un comitato può avere più membri. Questa situazione non è esprimibile né integrando la relazione nella tabella Persona
(tramite un eventuale attributo Persona.appartiene_a
) né integrandola nella tabella Comitato
(tramite un eventuale attributo Comitato.partecipanti
), in quanto un attributo può contenere un solo valore. La soluzione più semplice è inserire tutte le istanze della relazione AppartieneA
in una tabella Appartenenza
avente due attributi, membro
e comitato
, imponendo i necessari vincoli di foreign key verso le tabelle Persona
e Comitato
, rispettivamente.
Analogamente, anche gli attributi di un'entità possono essere reificati, qualora siano troppo complessi.
UML fornisce il costrutto association class per definire le relazioni reificate. Tale costrutto è sia di tipo "classe" che "associazione".[5]
Reificazione nel Web semantico
[modifica | modifica wikitesto]RDF e OWL
[modifica | modifica wikitesto]Nei linguaggi per il Web semantico, come Resource Description Framework (RDF) e Web Ontology Language (OWL), ogni affermazione (statement) è costituita da una relazione binaria, formata da soggetto, predicato e oggetto. Uno statement viene utilizzato per collegare due risorse o una risorsa e un valore. Talvolta, tuttavia, può essere necessario esprimere predicati riguardanti la stessa relazione. Ad esempio, potremmo voler rappresentare alcune proprietà della relazione stessa, come il suo grado di affidabilità, la sua rilevanza, la forza con cui soggetto e oggetto sono connessi, ecc.
Seguendo l'esempio sui comitati riportato nella sezione sulla modellazione concettuale, una particolare persona può essere indicata con URIref person:p1
, e un particolare comitato ex:c1
. La tripla RDF descrivente il fatto che p1
è membro di c1
è la seguente:
person:p1 ex:AppartieneA ex:c1 .
Si considerino ora i due seguenti casi:
- si vuole esprimere il fatto che una persona abbia nominato un'altra persona membro di un particolare comitato;
- si vuole esprimere il fatto che una persona abbia registrato tale nomina nella base di dati.
Nel primo caso si può attuare la classica reificazione (come sopra):
ex:Appartenenza rdf:type owl:Class .
ex:appartenenza0004 rdf:type ex:Appartenenza .
ex:appartenenza0004 ex:dellaPersona persona:p1 .
ex:appartenenza0004 ex:nelComitato ex:c1 .
person:p2 ex:nomina ex:appartenenza0004 .
Nel secondo caso, si necessita di esprimere affermazioni riguardanti lo statement stesso. Per far ciò, RDF fornisce un vocabolario dedicato alla descrizione degli statement, costituito dal tipo rdf:Statement
e dalle proprietà rdf:subject
, rdf:predicate
, e rdf:object.
.[6]
ex:appartenenza0004Stat rdf:type rdf:Statement .
ex:appartenenza0004Stat rdf:subject person:p1 .
ex:appartenenza0004Stat rdf:predicate committee:AppartieneA .
ex:appartenenza0004Stat rdf:object ex:c1 .
Queste quattro triple indicano che la risorsa indicata con URIref ex:appartenenza0004Stat
è uno statement RDF, che il soggetto di tale statement si riferisce alla risorsa identificata con person:p1
, il predicato alla risorsa identificata con committee:AppartieneA
e l'oggetto alla risorsa identificata con ex:c1
. Utilizzando la reificazione secondo tale convenzione, possiamo successivamente esprimere il fatto che person:p3
ha aggiunto la suddetta affermazione nella base di dati:
person:p3 ex:aggiungeNelDB ex:appartenenza0004Stat .
Reificazione e Topic Maps
[modifica | modifica wikitesto]Note
[modifica | modifica wikitesto]- ^ (EN) Michael Scott, Programming Language Pragmatics, San Francisco, CA, Morgan Kaufmann Publishers, 2006, p. 140.
- ^ (EN) The Java Language Specification, section 4.7, Java SE 7 Edition
- ^ (EN) O.-J. Dahl, Edsger Dijkstra, C. A. R. Hoare, Structured Programming, Londra, Academic Press, 1972, ISBN 0-12-200550-3.
- ^ (EN) Antoni Olivé, Conceptual Modeling of Information Systems, Springer Verlag, 2007.
- ^ (EN) Unified Modeling Language, UML superstructure, Object Management Group, 2 novembre 2007.
- ^ (EN) RDF Primer, su w3.org. URL consultato il 9 ottobre 2010.
Voci correlate
[modifica | modifica wikitesto]- Semantica denotazionale
- Semantica (informatica)
- Metamodellazione
- Metaoggetto
- Metaprogrammazione
- Semantica operazionale
- Riflessione (informatica)
- Resource Description Framework
- Topic Maps
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Tim Berners-Lee, Reifying RDF (properly), and N3, su w3.org, W3C, 17 dicembre 2004. URL consultato l'11 maggio 2016.