Tipi di dati astratti

Al livello fisico la macchina opera solo su stringhe di bit, ma per uno sviluppatore diventa tanto più difficile ragionare a quel livello quanto più diventa complesso un programma. Per questo i linguaggi di programmazione hanno adottato una serie di “capsule” che permettono di astrarre i dati in modo da poterli manipolare più facilmente.

Convenzionalmente un tipo di dato astratto consiste di:

Information hiding e Representation independence

Uno dei punti fondamentali dell’implementazione dell’astrazione è l’uso di interfacce: esse permettono al produttore e al consumatore di componenti software di stabilire un accordo sull’implementazione del dato astratto.

Untitled

Le interfacce permettono di nascondere i dettagli implementativi di un tipo di dato e così facendo migliorano la scomponibilità del codice in un modo simile a quanto abbiamo visto per il sottotipaggio e il polimorfismo parametrico: omettendo i dettagli dell’implementazione non possiamo fare assunzioni su di esa e siamo costretti a scrivere codice solo usando le interfacce fornite.

Oggetti

Concentriamoci ora sulla programmazione orientata agli oggetti.

In un linguaggio object-oriented il costrutto principale è l’oggetto: una capsula che contiene sia dei dati che le operazioni per manipolarli e che fornisce un’interfaccia con cui il mondo esterno può accedere all’oggetto.

I linguaggi OO forniscono agli oggetti la capacità di definire i dettagli di quanto sia opaca la loro implementazione: è possibile esprimere quali variabili e quali metodi sono visibili ovunque, quali sono per alcuni altri oggetti e quali completamente privati, quindi disponibili solo all’interno dell’oggetto stesso.

Tutti i linguaggi orientati agli oggetti creano questi in maniera dinamica, ricordandoci strutture allocate nell’heap. Mentre questo è il caso di Java, che crea oggetti nell’heap e vi accede per riferimento, altri linguaggi come C++ permettono anche l’allocazione e la deallocazione di oggetti nello stack.

Classi

Le classi sono un modo per creare un template di un oggetto, in modo da non dover specificare ogni volta i dati e i metodi da zero quando si voglia usare lo stesso oggetto più volte.

Le classi stabiliscono quali sono i dati di un oggetto, ne fissa i nomi, la firma, la visibilità e l’implementazione dei suoi metodi. In un linguaggio fornito di classi, ogni oggetto appartiene ad almeno una classe.

Classi vs prototipi