Incapsulamento (informatica)
# Incapsulamento (informatica)

Nei linguaggi di programmazione orientata agli oggetti, il termine incapsulamento (encapsulation) può essere usato per riferirsi a due concetti, collegati tra loro ma distinti o, a volte, alla combinazione dei due:

* un meccanismo del linguaggio di programmazione atto a limitare l'accesso diretto agli elementi dell'oggetto;
* un costrutto del linguaggio di programmazione che favorisce l'integrazione dei metodi (o di altre funzioni) propri della classe all'interno della classe stessa.

Alcuni ricercatori e universitari utilizzano il primo significato da solo o in combinazione con il secondo come una funzionalità identificativa dei linguaggi di programmazione orientati agli oggetti, mentre altri linguaggi di programmazione che prevedono la chiusura, vedono l'incapsulamento come una funzionalità indipendente dall'orientamento agli oggetti.

La seconda definizione è motivata dal fatto che in diversi linguaggi di programmazione orientata agli oggetti l'occultamento degli elementi non è automatico o può essere scavalcato da altri modificatori di visibilità, pertanto l'occultamento delle informazioni è definito come concetto separato da chi lo preferisce alla prima.

Le funzioni dell'incapsulamento sono implementate dalle classi nella maggior parte dei linguaggi di programmazione, tuttavia sono presenti anche altre alternative.

## Descrizione

### Utilizzo

I termini incapsulamento e occultamento delle informazioni (information hiding) vengono spesso usati come sinonimi, anche se, a rigore, esiste una differenza concettuale: l'occultamento delle informazioni è il principio teorico su cui si basa la tecnica dell'incapsulamento. Secondo il concetto dell'occultamento delle informazioni i dettagli implementativi di una classe – o di un costrutto di altro tipo (oggetto, modulo, ecc.) – sono nascosti all'utente. Pertanto una parte di un programma può nascondere informazioni incapsulandole in un costrutto dotato di interfaccia, permettendone l'occultamento. Tuttavia l'incapsulamento non è garanzia dell'occultamento delle informazioni, poiché potrebbe – se mal utilizzato o per motivi particolari – non nascondere i dettagli implementativi.

L'incapsulamento riduce il costo da pagare per correggere gli errori in fase di sviluppo di un programma. Questo risultato viene ottenuto strutturando l'intero progetto, ed i moduli che lo compongono, in modo che un'errata decisione presa nell'implementazione di un singolo modulo non si ripercuota sull'intero progetto, e possa essere corretta modificando soltanto quel modulo. Si potrà così evitare di dover modificare anche i moduli clienti, che interagiranno con il modulo incapsulato soltanto attraverso interfacce.

L'uso più frequente dell'incapsulamento è quello di nascondere lo strato fisico in cui vengono memorizzati i dati; in tal modo, se la rappresentazione interna dei dati cambia, le modifiche si propagano soltanto ad una piccola parte del programma. Supponiamo, ad esempio, che un punto di uno spazio tridimensionale sia rappresentato dalle coordinate $x,y,z$ espresse da tre numeri in virgola mobile, e che, successivamente, si passi ad una rappresentazione delle coordinate del punto mediante un singolo array a tre dimensioni: un modulo di programma progettato secondo la tecnica dell'incapsulamento proteggerà il resto del programma da questo cambiamento di rappresentazione.

### Esempi

Da un punto di vista generale – quindi non solo applicato alla progettazione del software – l'incapsulamento può essere visto come la suddivisione di un sistema complesso in unità modulari aventi ciascuna una funzionalità ben definita. Ad esempio, un'automobile è un macchinario piuttosto complesso. Per facilitarne il progetto, la fabbricazione e la manutenzione è vantaggioso suddividerla in "moduli" dotati di mutue interfacce, in modo che la progettazione dell'insieme possa prescindere dalla definizione dei dettagli dei singoli moduli, rendendo in questo modo l'automobile non solo più facile da progettare, ma anche più economica da produrre.

Continuando con l'esempio dell'automobile, una casa automobilistica potrebbe avere un modello di lusso, equipaggiato con un motore più potente, ed un modello economico, dotato di un motore standard. Ai progettisti conviene prevedere per entrambi i motori gli stessi collegamenti (interfacce) con il resto della vettura, in modo che tutti e due possano essere assemblati all'interno del medesimo vano motore, unificato nelle due versioni. Gli stessi motori, quindi, si potranno collegare allo stesso albero di trasmissione, agli stessi supporti ed agli stessi comandi. La differenza fra le due versioni è che quella di lusso avrà un motore con cilindrata maggiore e gli iniettori progettati per fornire il maggior volume di miscela aria-carburante che il motore di cilindrata maggiore richiede. In aggiunta al motore più potente, la versione di lusso può anche essere equipaggiata con altri optional, come un'autoradio con incorporato lettore CD, sedili più comodi, migliori sospensioni, pneumatici più larghi e differenti colori. Nonostante queste varianti, la maggior parte della vettura di lusso è uguale alla versione più economica. L'autoradio con lettore CD è un "modulo" che sostituisce la radio normale, che, a sua volta, è un modulo della versione economica. I sedili più confortevoli sono montati sui medesimi supporti di quelli standard. Che i sedili siano di pelle, plastica, abbiano il supporto lombare o no, non ha importanza.

I responsabili del progetto dividono il compito in sotto-progetti di singole parti e li assegnano a team di lavoro separati. Ogni team progetta la parte di propria competenza in ottemperanza ad una ben definita normativa e dotandola delle interfacce necessarie ad assicurare allo stesso tempo: massima flessibilità nella progettazione della parte e facilità del suo assemblaggio con le altre parti.

Come risulta dagli esempi, la tecnica dell'incapsulamento permette di ottenere una grande flessibilità del lavoro di progettazione del software. I programmatori possono modificare facilmente le funzionalità di un programma, proprio come se si trattasse di semplici operazioni di manutenzione, per meglio adattarlo alle esigenze dell'utente. Quando il codice sorgente di un programma è suddiviso in blocchi modulari in modo da tener conto dei principi dell'occultamento delle informazioni, le successive operazioni di modifica e manutenzione sono molto più facili perché i cambiamenti sono localizzati e non globali, e quindi si riduce notevolmente il rischio di introdurre errori ed il tempo necessario per eseguire le operazioni di test e debug.

