Cos'è l'astrazione in programmazione?
In programmazione, l'astrazione consiste nel nascondere i dettagli di come funziona qualcosa dietro un'interfaccia più semplice, così puoi usarlo sapendo solo cosa fa. Chiamare sorted(names) ordina una lista senza che tu debba scrivere, o anche solo vedere, l'algoritmo di ordinamento.
Aggiornato il 24 settembre 2026
Quando scrivi print("hi"), non pensi a come quelle lettere arrivano sullo schermo. Sotto quella riga, Python trasforma il testo in byte e chiede al sistema operativo di scriverli, il sistema operativo li passa al tuo terminale, e il terminale disegna ogni lettera in pixel usando un font. Ogni livello offre a quello sopra una promessa semplice e nasconde come la mantiene. Questo nascondere è l'astrazione, e ogni programma poggia su molti livelli di questo tipo.
Livelli di astrazione
| Livello | Con cosa lavori | Cosa nasconde |
|---|---|---|
| Il tuo programma | print("hi"), sorted(names) | Come la libreria fa il lavoro |
| Python e la sua libreria standard | Stringhe, liste, file | La gestione della memoria, le chiamate di sistema |
| L'interprete (CPython) | Bytecode | Il codice C e il codice macchina che lo eseguono |
| Sistema operativo | File, processi | Blocchi del disco, driver dei dispositivi, scheduling della CPU |
| Hardware | Istruzioni macchina | Transistor e segnali elettrici |
Ogni livello è costruito su quello sottostante e si può capire senza di esso. Puoi scrivere Python funzionante senza sapere cos'è un blocco del disco, e il sistema operativo può salvare un file senza sapere che contiene codice Python.
Come funziona l'astrazione nel codice
Chi programma costruisce i propri livelli in due modi principali.
L'astrazione procedurale è una funzione. Il nome, i parametri e il valore restituito sono l'interfaccia; il corpo è il dettaglio nascosto. Una volta che average(scores) esiste, il resto del programma la usa senza leggere come somma e divide.
L'astrazione dei dati definisce un tipo in base a cosa puoi farci, non a come memorizza le cose. Una coda è "aggiungi in fondo, prendi dall'inizio". Come gli elementi stanno in memoria è una decisione privata:
serving soup
serving pasta
serving cake
Il codice in fondo non sa nulla di deque. Se lo sostituisci con una lista normale e pop(0), l'output è identico, solo più lento con code lunghe, perché togliere il primo elemento di una lista sposta tutti gli altri. L'interfaccia è rimasta la stessa, quindi niente fuori dalla classe ha dovuto cambiare.
Classi astratte e interfacce
Nella programmazione a oggetti, astrazione di solito significa stabilire cosa deve fare una famiglia di classi e lasciare il come a ciascuna classe. In Python, il modulo abc marca un metodo come astratto; una classe con un metodo astratto non implementato non può essere istanziata:
email to ana@example.com: Your package arrives today
sms to +15550100: Your package arrives today
Notifier is abstract: create an Email or an SMS instead
remind() dipende solo dall'astrazione: qualsiasi cosa abbia un metodo send. Aggiungere le notifiche push significa scrivere una sola classe nuova, e remind() resta intatta. Quest'ultimo passo, una sola chiamata che esegue codice diverso per classi diverse, è il polimorfismo: l'astrazione definisce l'interfaccia comune, il polimorfismo la fa funzionare.
Java ha gli stessi strumenti sotto forma di parole chiave:
interface Notifier {
void send(String to, String text);
}
class Email implements Notifier {
public void send(String to, String text) { /* talk to the mail server */ }
}
Scrivere new Notifier() è un errore di compilazione, perché un'interfaccia non ha un'implementazione da eseguire. La documentazione spiega nel dettaglio le classi astratte e le interfacce in Java.
Astrazione e incapsulamento
Le due idee compaiono insieme così spesso che è facile confonderle.
| Astrazione | Incapsulamento | |
|---|---|---|
| Domanda a cui risponde | Cosa fa questo? | Chi può toccare i dati? |
| Su cosa si concentra | L'interfaccia: le operazioni offerte | L'interno: i dati dietro l'interfaccia |
| Strumenti principali | Funzioni, classi astratte, interfacce, moduli | private, _name, proprietà, #fields |
| Esempio | Notifier.send() funziona per email e SMS | _balance cambia solo tramite withdraw() |
| Livello | Progettazione | Implementazione |
L'astrazione decide quali operazioni mostrare; l'incapsulamento si assicura che il resto resti nascosto. La Queue qui sopra fa entrambe le cose: add e next sono l'astrazione, e il trattino basso in _items è l'incapsulamento.
Astrazioni che perdono e altri errori
Joel Spolsky ha formulato nel 2002 la legge delle astrazioni che perdono (leaky abstractions): ogni astrazione non banale lascia trapelare parte del dettaglio nascosto. I numeri in virgola mobile sono la perdita classica. Sembrano normali decimali, finché non si intravede la memorizzazione binaria sottostante:
0.30000000000000004
False
Né 0,1 né 0,2 si possono memorizzare esattamente in bit binari, quindi la somma è leggermente sbagliata. Puoi usare i float per anni senza pensarci, ma non per sempre, ed è per questo che conviene conoscere un livello sotto quello in cui lavori.
Altri due errori sono comuni:
- Astrarre troppo presto. Una gerarchia di classi costruita per casi che non arrivano mai è codice in più da leggere e modificare. Sandi Metz l'ha detto così: "la duplicazione costa molto meno dell'astrazione sbagliata".
- Confondere l'astrazione con la parola chiave
abstract. Le classi astratte sono uno strumento. Anche ogni funzione con un buon nome è un'astrazione.
Cosa leggere dopo
Leggi incapsulamento e polimorfismo per completare il quadro della programmazione a oggetti. La pagina sul sistema operativo mostra la più grande astrazione su cui si appoggiano i tuoi programmi. Per esercitarti, il corso Python costruisce classi e funzioni fin dall'inizio, e il corso Java tratta classi astratte e interfacce.
Domande frequenti
Qual è un esempio di astrazione?
len(items) sapendo cosa restituisce, non come conta Python. I pedali di un'auto sono la versione quotidiana, perché controlli la velocità senza sapere come il motore brucia il carburante. Nel codice a oggetti, un'interfaccia come Notifier con un solo metodo send è un'astrazione sopra email, SMS e notifiche push.Cos'è l'astrazione in Python?
abc ti permette di dichiarare una classe base astratta con @abstractmethod; a quel punto Python si rifiuta di creare oggetti di quella classe, o di qualsiasi sottoclasse che non abbia implementato tutti i metodi astratti.Cos'è l'astrazione nella programmazione Java?
new. Un'interfaccia elenca i metodi che ogni classe che la implementa deve fornire, e una classe può implementare più interfacce.