Il galateo del programmatore

Scrivere software non è un’attività puramente tecnica, così come scrivere un articolo per un giornale non è una mera elencazione di fatti. È anche un esercizio di stile, del tutto simile a quello che si mette in atto quando si scrive un romanzo.

I linguaggi di programmazione, sempre molto rigidi nel rispetto delle regole sintattiche (molto più rigidi di quanto non sia un correttore di bozze), ma lasciano spesso, al programmatore, alcune libertà che, se mal utilizzate, come tutte le libertà, si rivelano deleterie e, quasi sempre, si ritorcono contro l’autore.

Attraverso le scelte “di stile” il programmatore può veicolare messaggi ulteriori rispetto al contenuto dei propri lavori. Scegliendo una forma piuttosto che un’altra, in una certa misura si comunicano informazioni che, spesso, aiutano chi legge (spesso lo stesso autore) a decifrare il contenuto di un programma.

I nomi delle variabili
La scelta dei nomi da assegnare alle variabili riveste grande importanza nella scrittura di un programma. A ogni variabile si deve sempre dare un nome sensato, che ne richiama il significato e l’utilizzo che se ne fa nel programma. Anche il tipo di dato contenuto nelle variabili può essere suggerito dal nome che, comunque, non deve mai essere troppo lungo.

Ad esempio, le variabili intere avranno nomi che iniziano con una lettera compresa tra “i” e “n”. Per variabili ausiliarie e indici si tenderà a usare nomi composti di una sola lettera, mentre, di norma il nome evocherà la quantità che rappresenta. Per esempio x, y e z sono nomi sensati per coordinate di un punto, così come t e T possono rappresentare, rispettivamente, un tempo e una temperatura. Se si usano variabili composte di più parole si può usare la convenzione secondo la quale la prima lettera di ogni parola, esclusa la prima, va scritta in maiuscolo. Per esempio: gasPressure, totalCrossSection, etc.

Il ruolo delle funzioni
Specialmente all’inizio della loro carriera di programmatori, molti tendono a scrivere funzioni che includono la stampa di messaggi relativi al risultato delle operazioni che la funzione deve svolgere. Questo è un errore.

Le funzioni, a meno che non siano state pensate proprio allo scopo di stampare un risultato (nel qual caso, devono occuparsi esclusivamente di questo aspetto), devono sempre limitarsi a calcolare e a restituire il risultato richiesto, che poi sarà stampato a cura del programma che userà la funzione.

La scelta degli operatori
In alcuni casi, i linguaggi di programmazione permettono di usare operatori diversi per giungere allo stesso risultato. Per esempio, in C esiste l’operatore di autoincremento che serve per aggiungere al valore corrente di una variabile una certa quantità. Quello che, anche in C, si potrebbe scrivere come

a = a + 3;

nel C si scrive più propriamente come

a += 3;

Premesso che anche la prima forma è corretta e che il compilatore C la processa senza alcun problema, quest’ultima notazione rende molto più evidente il significato dell’operazione che si sta compiendo, e non si rischia di confondere la notazione con quella equivalente di un’equazione matematica che non ha una soluzione. Se poi, invece di 3, si vuole sommare alla variabile di sinistra il valore intero 1, allora si preferirà scrivere

a++;

invece di

a += 1; 

Anche in questo caso non cambia nulla nella sostanza, ma il registro col quale si comunica si adatta alle circostanze. In fondo, anche quando scrivete un’email scegliete opportunamente la forma secondo che il destinatario sia un conoscente o un’Autorità. Il messaggio può essere lo stesso, ma la forma cambia secondo i casi. Per annunciare la disdetta di un appuntamento, per esempio, potete dire

Ciao. Mi spiace, ma stasera non posso più venire

se state comunicando con un amico, mentre scriverete

Spiace comunicare che, per cause di forza maggiore, non mi sarà possibile essere presente all’incontro previsto per la prossima settimana

se invece dovete disdire un appuntamento di lavoro. Quando si scrive un programma occorre pensare negli stessi termini, cercando di comunicare più di quanto non sia strettamente necessario per una sua corretta esecuzione.

La programmazione strutturata
I programmi strutturati sono quelli composti unicamente di “strutture”: moduli che rappresentano tutti i possibili gruppi di istruzioni che hanno la proprietà di avere un solo punto d’entrata e un solo punto d’uscita. Furono introdotte da Bohm e Jacopini nel 1966. I due matematici identificarono tre tipi di strutture: sequenziale, di selezione e di iterazione.

La struttura sequenziale rappresenta una qualunque sequenza di operazioni eseguite nell’ordine in cui sono scritte. Le strutture di selezione sono quelle in cui si controlla il risultato di un’espressione logica e si esegue l’uno o l’altro gruppo di istruzioni secondo il risultato. Le strutture di iterazione, infine, sono quelle che permettono di ripetere le operazioni più volte.

Un programma strutturato garantisce un controllo maggiore sul flusso delle operazioni, grazie proprio alla presenza di un unico punto d’entrata e un unico punto d’uscita dalle strutture.

Per realizzare un programma strutturato basta seguire poche semplici regole: evitare di usare istruzioni tipo break e scrivere funzioni che hanno un solo return. Va da sé che l’istruzione goto dovrebbe essere bandita da ogni programma degno di tale nome.

I programmi strutturati sono più leggibili, più facili da manutenere e più solidi dal punto di vista della possibilità che includano errori (bug) di programmazione.

Questioni di efficienza
Quando vi si chiede di scrivere il codice necessario per decidere se si sia o meno verificata una determinata condizione, fatevi sempre la domanda: “faccio prima a individuare la situazione secondo cui la condizione è vera o quando questa è falsa?”.

Per verificare, ad esempio, se una stringa sia palindroma, si potrebbe costruire una stringa i cui caratteri siano disposti al contrario e confrontare questa con quella originale; oppure ancora confrontare tutte le coppie di caratteri (str[i], str[N-1-i]), dove N rappresenta la lunghezza della stringa e i va da zero a N/2.

Per verificare, al contrario, che la stringa NON sia palindroma, basta scrivere un codice che esegue i confronti carattere per carattere e abbandona l’iterazione non appena uno di questi confronti dia esito negativo. Basta quindi negare la risposta per fornire la funzione richiesta.

La scelta del costrutto per le iterazioni
Quando si sceglie il costrutto da usare per compiere iterativamente una serie di istruzioni, solitamente si può scegliere tra almeno due alternative: il for e il while. Quest’ultima forma è spesso disponibile nelle varianti while (...) do {...} o nella forma do {...} while (...) (secondo i linguaggi di programmazione). Naturalmente i costrutti sono tutti equivalenti dal punto di vista del risultato che si può ottenere ed è quasi sempre facile trasformare un ciclo in un altro. Ma adottando i criteri sotto riportati si scriverà codice irreprensibile, facile da comprendere e da manutenere.

Il costrutto for si sceglie quando il numero di passi da compiere è noto o si può calcolare immediatamente prima di entrare nel ciclo. Quando invece il numero di passi che saranno compiuti dall’algoritmo non è noto a priori si preferisce usare il while in una delle due forme. Se disponibili entrambe, il costrutto do {...} while (...) si usa per sottolineare che il ciclo sarà percorso almeno una volta.

Per esempio, nell’esempio della stringa palindroma, l’approccio di “forza bruta” consistente nel testare tutte le coppie di caratteri si eseguirebbe attraverso un ciclo for. Se invece optiamo per la soluzione più efficiente non possiamo sapere quante volte percorreremo il ciclo prima di entrarvi, pertanto sceglieremo il costrutto while.

L’International Obfuscated C Code Contest
Quanto sopra permette di scrivere codice facilmente interpretabile, il che ne permette una manutenzione semplice anche a distanza di tempo. Vi qualifica anche come programmatori accurati e attenti. Garantisce che, qualora la vostra libreria di funzioni cresca enormemente, il controllo del codice si possa mantenere senza sforzi.

Se imparerete ad adottare queste regole di certo non ve ne pentirete, a meno che non abbiate intenzione di partecipare a un curioso concorso denominato The International Obfuscated C Code Contest. Potete consultarne le regole sul sito ioccc.org. A proposito: uno dei miei preferiti è https://www.ioccc.org/2018/yang/prog.c.

Un pensiero riguardo “Il galateo del programmatore

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...