ebEnrico Betti

Appunti di mestiere

Come scrivo codice dopo quarant'anni di errori

Un modo personale di disporre codice, commenti e test affinché le anomalie si facciano notare.

Programmo dai primi anni Ottanta. Molte delle abitudini con cui ancora oggi scrivo codice non me le sono inventate: arrivano dai listati dell'epoca, dai libri sull'assembler, dai linguaggi che ho usato e da migliaia di errori fatti nel frattempo.

In TEA: un assembler residente per 8080, un libro di codice per 8080, il sorgente assembler era disposto sulla pagina in modo estremamente regolare. Codice e commenti occupavano spazi distinti, le strutture erano riconoscibili anche geometricamente. Molti anni dopo, con ambienti come Visual Basic, continuava a essere naturale pensare al programma anche come a qualcosa che si dispone nello spazio.

Oggi una parte sempre maggiore del codice può essere scritta da un'intelligenza artificiale. Si potrebbe pensare che queste attenzioni abbiano perso importanza.

A me sembra il contrario.

Dire «ormai il codice lo scrive l'IA, quindi non importa più saperlo scrivere» somiglia molto a dire «esiste la calcolatrice, quindi non serve più saper fare i conti». La calcolatrice ha eliminato una parte del lavoro meccanico; non ha eliminato la necessità di accorgersi che 17 × 23 non può fare 8.941.

Come scrivo

Una funzione molto semplice, scritta in una forma comune, potrebbe essere:

// Somma i valori positivi
function somma_positivi($valori) {
    $somma = 0;
    foreach ($valori as $valore) {
        if ($valore > 0) {
            $somma += $valore; // aggiorna il totale
        }
    }
    return $somma;
}

Io tendo a scriverla così:

// Somma i valori positivi perché quelli negativi non devono concorrere al totale.
function somma_positivi($valori)
{ $somma=0;                            // totale parziale
  foreach ($valori as $valore)
  { if ($valore>0)                     // considera solo i valori positivi
    { $somma+=$valore;                 // aggiorna il totale
    }
  }
  return $somma;                        // risultato
}

Le regole sono poche: due spazi per ogni livello e niente tabulazioni; parentesi graficamente allineate; commenti sulla stessa riga e possibilmente allineati a destra.

Il commento prima della funzione è l'eccezione: sta a sinistra e dice brevemente che cosa fa quella funzione e perché esiste. Serve anche a me, quando torno sul codice mesi o anni dopo.

Quando è utile, lascio ancora spazio a destra per test, valori attesi o stato dell'algoritmo. Il sorgente può così contenere tre informazioni visivamente separate:

codice  |  significato  |  test / stato atteso

Questo è un metodo personale, non una proposta di stile universale. Nei programmi reali un commento dovrebbe aggiungere soprattutto intenzione, vincoli o valori attesi, non limitarsi a tradurre in italiano l'istruzione accanto. Qui alcuni commenti volutamente elementari servono a rendere visibili le colonne.

Le anomalie diventano visibili

Non è soltanto una questione di leggibilità. La regolarità permette di vedere le anomalie.

// Esempio: un solo spazio fuori posto
  foreach ($valori as $valore)
  { if ($valore>0)
     { $somma+=$valore;                // questo spazio è sospetto
    }
  }

Quel singolo spazio in più non rende necessariamente sbagliato il programma. Ma rompe la geometria e attira immediatamente l'occhio.

Un caso ancora più interessante è questo:

  foreach ($valori as $valore)
  { if ($valore>0)                     // considera solo i valori positivi
    { $somma+=$valore;                 // aggiorna il totale
      $conta++;                         // conta i valori ammessi
    }
      $letti++;                         // conta tutti i valori letti
  }

$letti++ è fuori dal blocco dell'if e potrebbe essere esattamente dove deve stare. Ma sporge senza appartenere graficamente a nulla. Prima ancora di interpretare il codice, quella riga mi invita a controllarla.

Questo è lo scopo.

La sintassi descrive la struttura del programma. L'indentazione la descrive una seconda volta, geometricamente. I commenti e, quando servono, i test aggiungono ulteriori informazioni indipendenti.

Se queste descrizioni non concordano, qualcosa merita attenzione.

Non è un sistema che impedisce di fare errori. È semplicemente un modo di scrivere codice che cerca di fare in modo che gli errori si facciano notare.

← Torna agli scritti