{ } Programmazione

Dare nomi nel codice: variabili e funzioni che si spiegano

Come scegliere buoni nomi per variabili, funzioni e classi: intenzione, unità di misura, booleani, convenzioni ed errori comuni, con esempi prima e dopo.

Il codice viene letto molte più volte di quante venga scritto. Lo legge chi lo revisiona, chi lo corregge, chi aggiunge una funzione mesi dopo, spesso lo stesso autore che nel frattempo ha dimenticato tutto. In questa lettura continua, i nomi sono la forma di documentazione più immediata: un buon nome fa capire in un istante cosa contiene una variabile o cosa fa una funzione; un cattivo nome costringe a leggere il codice riga per riga per ricostruirlo.

Il nome deve rivelare l'intenzione

Confronta queste due versioni della stessa riga:

d = 86400
SECONDI_IN_UN_GIORNO = 86400

La seconda non richiede commenti. Un buon nome risponde a tre domande: che cosa rappresenta questo valore, perché esiste, come va usato. Se per spiegare un nome serve un commento, di solito il nome va cambiato.

Un altro esempio, una funzione:

def elabora(lista):
    return [x for x in lista if x.stato == "A" and x.saldo > 0]
def clienti_attivi_con_credito(clienti):
    return [c for c in clienti if c.e_attivo() and c.saldo > 0]

La logica è identica, ma la seconda versione si capisce senza conoscere il significato del codice di stato "A".

Regole pratiche

Includi le unità di misura

Una variabile chiamata timeout può essere in secondi o in millisecondi, e la differenza può causare bug difficili da trovare. timeout_secondi o durata_ms eliminano l'ambiguità. Lo stesso vale per valute, distanze, dimensioni in byte o in kilobyte.

Booleani che si leggono come domande

I valori vero/falso dovrebbero avere nomi che suonano come una domanda con risposta sì o no: e_valido, ha_permessi, puo_modificare, is_active. Evita le negazioni: non_disabilitato costringe a una doppia negazione mentale ogni volta che lo si legge, soprattutto in espressioni come if not non_disabilitato.

Funzioni con un verbo

Le funzioni compiono azioni, quindi il nome inizia di solito con un verbo: calcola_totale, invia_notifica, carica_configurazione. Le funzioni che restituiscono un booleano seguono la regola delle domande: e_scaduto(abbonamento).

Lunghezza proporzionata alla portata

Un indice in un ciclo di tre righe può chiamarsi i senza problemi: il contesto è tutto lì, visibile. Una variabile usata in tutto un modulo, invece, merita un nome completo e descrittivo. La regola: più ampia è la portata, più il nome deve essere esplicito.

Coerenza nel vocabolario

Se in una parte del codice si usa recupera_utente, in un'altra ottieni_cliente e altrove carica_account per operazioni equivalenti, chi legge si chiederà se ci sono differenze. Scegli un termine per ogni concetto e usalo ovunque. Vale anche per i concetti del dominio: se l'azienda parla di «pratiche», il codice non dovrebbe parlare di «ticket».

Errori frequenti

Nome debole Problema Alternativa
data Troppo generico, non dice cosa contiene ordini_del_mese
temp, tmp Non spiega il ruolo del valore prezzo_senza_iva
lista_utenti (che è un insieme) Il nome mente sul tipo utenti
gestore, manager Dice poco sulla responsabilità pianificatore_spedizioni
x1, x2 Nessun significato prezzo_iniziale, prezzo_finale
flag Non dice cosa indica richiede_approvazione

Il caso del nome che "mente" è il più insidioso: una variabile chiamata utenti_attivi che in realtà contiene anche utenti sospesi porta a decisioni sbagliate da parte di chi si fida del nome. Quando il significato di un valore cambia, il nome va aggiornato.

Convenzioni del linguaggio

Ogni linguaggio ha convenzioni di scrittura che vale la pena rispettare, perché rendono il codice familiare a chiunque lo conosca:

  • in Python, snake_case per variabili e funzioni, PascalCase per le classi, MAIUSCOLO_CON_UNDERSCORE per le costanti;
  • in JavaScript e Java, camelCase per variabili e funzioni, PascalCase per le classi.

Un'altra decisione da prendere a livello di team è la lingua dei nomi. Molti progetti scelgono l'inglese, che si sposa con le parole chiave del linguaggio e con le librerie; altri usano l'italiano per i concetti di dominio, perché aderiscono meglio al linguaggio dei clienti. Entrambe le scelte sono legittime; il mescolamento casuale, come getCliente accanto a fetch_customer, non lo è.

Rinominare senza paura

Un nome sbagliato non è una condanna. Gli editor moderni offrono funzioni di rinomina automatica che aggiornano tutte le occorrenze in modo sicuro, e una buona suite di test conferma che nulla si è rotto. Nel mio lavoro, quando torno su un codice e impiego più di qualche secondo a capire cosa rappresenta una variabile, la rinomino subito: è uno dei refactoring più economici e con il ritorno più alto.

In sintesi

  • I nomi sono la documentazione più letta: devono rivelare cosa rappresenta un valore e perché esiste.
  • Includi le unità di misura e dai ai booleani la forma di una domanda.
  • Usa verbi per le funzioni e nomi tanto più espliciti quanto più ampia è la loro portata.
  • Mantieni un vocabolario coerente e rispetta le convenzioni del linguaggio.
  • Rinomina appena un nome non è più chiaro o non corrisponde più al contenuto.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche