Reificazione (informatica)
# 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.

La reificazione è una tecnica molto comune nel paradigma orientato agli oggetti, in analisi concettuale e nella rappresentazione della conoscenza.

## Reificazione e linguaggi riflessivi

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)
* Molti linguaggi, come Lisp, JavaScript e Curl, forniscono una procedura chiamata eval o evaluate che reifica a tutti gli effetti l'interprete del linguaggio. Ad esempio, scrivendo uno script JavaScript del tipo:for(var i=1; i<=3; i++) eval("document.myform.object"+i+".value=0"); equivale a scrivere document.myform.object1.value=0 document.myform.object2.value=0 document.myform.object3.value=0 In questo modo, come si può notare è molto semplice manipolare gli oggetti senza utilizzare direttamente i nomi delle variabili, bensì ricavandoli dinamicamente.

## Reificazione dei dati e refinement

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.

## Reificazione nella modellazione concettuale

La reificazione è largamente impiegata nella modellazione concettuale. 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".

## Reificazione nel Web semantico

### RDF e OWL

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:

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):

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..

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:

