Menu
Coddy logo textTech

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.

Di Kevin Spektor, Cofondatore e CTO

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

LivelloCon cosa lavoriCosa nasconde
Il tuo programmaprint("hi"), sorted(names)Come la libreria fa il lavoro
Python e la sua libreria standardStringhe, liste, fileLa gestione della memoria, le chiamate di sistema
L'interprete (CPython)BytecodeIl codice C e il codice macchina che lo eseguono
Sistema operativoFile, processiBlocchi del disco, driver dei dispositivi, scheduling della CPU
HardwareIstruzioni macchinaTransistor 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.

AstrazioneIncapsulamento
Domanda a cui rispondeCosa fa questo?Chi può toccare i dati?
Su cosa si concentraL'interfaccia: le operazioni offerteL'interno: i dati dietro l'interfaccia
Strumenti principaliFunzioni, classi astratte, interfacce, moduliprivate, _name, proprietà, #fields
EsempioNotifier.send() funziona per email e SMS_balance cambia solo tramite withdraw()
LivelloProgettazioneImplementazione

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?
Una funzione è il più semplice: chiami 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?
Ogni funzione, classe e modulo di Python è un'astrazione sul codice che contiene. Per una versione formale, il modulo standard 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?
Java esprime l'astrazione con classi astratte e interfacce. Una classe astratta può contenere metodi astratti, che non hanno corpo e devono essere implementati dalle sottoclassi, e non può essere istanziata con new. Un'interfaccia elenca i metodi che ogni classe che la implementa deve fornire, e una classe può implementare più interfacce.
Quali sono i quattro pilastri della OOP?
Incapsulamento, astrazione, ereditarietà e polimorfismo. L'incapsulamento protegge i dati di un oggetto, l'astrazione mostra solo cosa fa l'oggetto, l'ereditarietà permette a una classe di riutilizzare il codice di un'altra, e il polimorfismo permette allo stesso codice di funzionare con molti tipi attraverso un'interfaccia comune.
L'astrazione può peggiorare il codice?
Sì, quando arriva troppo presto o nasconde la cosa sbagliata. Il codice costruito per casi che non arrivano mai ha livelli in più da leggere e modificare senza alcun vantaggio. Una regola diffusa è aspettare di aver scritto codice simile due o tre volte, così la forma comune è chiara prima di darle un nome.
Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA