se una volta solapeuc
Se leggete più volte questa frase spostando l’attenzione sulle varie parti otterrete un effetto simile a quello che danno certi disegni di Escher.
Tutto ruota intorno al “se”. La cosa buffa è che, in ultima analisi, leggere la frase intendendo che il “se” si è usato una sola volta o leggerla con la particella usata nela sua naturale funzione porta a due situazioni allo stesso tempo simili  e diverse.
Inoltre, ad essere sinceri, la frase mi piace perchè evoca un’atmosfera fiabesca per la sua parentela con “il c’era una volta”.
Non sto scrivendo in preda all’alcol o ad altro.
Tutto è cominciato molti anni fa, giocando con il “for”.
Immaginate un ciclo, non importa con quale linguaggio, nel quale quando si verifica una certa condizione si effettua un’azione.
Banalmente stampare tutti gli elementi di una lista meno uno.
Es:
Nella lista “l” non si stampi l’elemento persona:

(python)

l=['albero','auto','persona','casa','strada']
for x in l:
    if x != 'persona' :
        print(x)

(javascript)

var l=['albero','auto','persona','casa','strada'];
for (var i=0; i< l.length;i++){
 if(l[i] != 'persona')
     console.log(l[i]);
}

La cosa che non mi piace è la ripetizione del controllo dopo che è stato trovato l’elemento da non stampare. Se ad un umano diamo un sacchetto contenente un certo numero di palle bianche ed una sola nera e gli ordiniamo:
estrai tutte le palle bianche.
Il nostro amico controllerà il colore ad ogni estrazione, ma una volta trovata la palla nera cesserà di controllare perché ormai la condizione – palla nera – si è verificata e sa che non si ripeterà.
A meno che non sia ottuso o non si fidi delle specifiche.
In informatica (purtroppo non nel mondo reale) si da per scontato che le specifiche siano vere.
Pertanto il nostro semplice programmino si comporta da stupido: continua
a controllare imperterrito anche dopo che la condizione si è verificata.
Naturalmente si può modificare il codice per renderlo più intelligente; provateci
e vedrete che le cose si complicheranno più del previsto.

La mia frase simbolo serve a ricordarmi che scrivere buon codice è difficile e faticoso; per vincere le cattive abitudini e l’approssimazione spesso le idiosincrasie sono più importanti delle passioni.

3 pensieri su “

  1. Peter

    Il problema consiste di due compiti: Trovare (e rimuovere) l’elemento malgradito, e stampare tutti (gli altri) elementi. Nella tua for-loop sono presenti quei due amici: il test (“if”) e l’esecuzione (“print”). Non si può semplificare il problema di più, quindi in fin dei conti ci vogliono due loop, uno col test e uno senza, oppure una fase di rimozione e un semplice loop solo per stampare.


    l = ['albero', 'auto', 'persona', 'casa', 'strada']
    l.remove('persona')
    for x in l:
    print(x)

    (NB: try-except ignorato)

    Rispondi
    1. giuseppe materni Autore articolo

      Togliere l’elemento è una soluzione semplice e quindi hai ragione. Ma per tornare all’esempio con l'”umano” dovrebbe prima trovare l’elemento in questione e quindi fare un loop. Ovviamente resta la soluzione dei due cicli. Niente di particolarmente complicato. Ma qualche riga di codice ci vuole. Il mio intento era quello di far vedere che situazioni che nella comunicazione normale sono banali, nella scrittura del codice si complicano.

      Rispondi
  2. Roberto

    In realtà un umano deve comunque ricordarsi di aver già trovato la palla nera prima di poter evitare il test, che si traduce in un:


    var l = ['albero', 'auto', 'persona', 'casa', 'strada'];
    var trovato = false;
    for (var i=0; i< l.length; i++) {
    if (trovato || l[i] != 'persona')
    console.log(l[i]);
    else
    trovato = true;
    }

    una volta “trovato” non viene più eseguito il test su “persona”, ma soltanto su “trovato”

    Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *