Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ripensare i cicli

Alcune considerazione sull'uso dei cicli while e loop nell'ambito della programmazione funzionale con il linguaggio Javascript.
Alcune considerazione sull'uso dei cicli while e loop nell'ambito della programmazione funzionale con il linguaggio Javascript.
Link copiato negli appunti

Tra i costrutti sintattici più utilizzati della programmazione procedurale
ci sono senz'altro i loop o cicli. Sia che si tratti di while che
di for o di altri analoghi costrutti, quando abbiamo a che fare
con una serie di dati omogenei su cui eseguire delle operazioni ci viene
naturale pensare ad un loop, indipendentemente dal linguaggio utilizzato
per programmare.

Consideriamo il seguente codice:

var libri = [{
   autore: "Alessandro Manzoni",
   titolo: "I promessi sposi"
}, {
   autore: "Emilio Salgari",
   titolo: "Le tigri di Mompracem"
}, {
   autore: "Dante Alighieri",
   titolo: "La Divina Commedia"
}, {
   autore: "Emilio Salgari",
   titolo: "Il corsaro nero"
}, {
   autore: "Giovanni Verga",
   titolo: "I Malavoglia"
}];
var libriDiSalgari = [];
for (let i = 0; i < libri.length; i++) {
   if (libri[i].autore == "Emilio Salgari") {
      libriDiSalgari.push(libri[i]);
   }
}

Non è difficile comprendere qual è il suo obiettivo: ottenere un array dei
libri di Emilio Salgari. In generale, interpretare un ciclo for
non è di per se molto complesso, ma richiede certamente un minimo di
analisi della modalità con cui viene gestito il contatore e dell'operazione
applicata a ciascun elemento dell'array. L'interpretazione si fa più
difficile quando l'operazione sui singoli elementi dell'array diventa un
po' più complessa.

Consideriamo infatti il seguente esempio di codice che lavora sullo stesso
array:

var numElements = libri.length;
var temp;
for (let i = numElements; i >= 2; --i) {
   for (let j = 0; j <= i - 1; ++j) {
      if (libri[j].autore > libri[j + 1].autore) {
         temp = libri[j];
         libri[j] = libri[j + 1];
         libri[j + 1] = temp;
      }
   }
}

Interpretare a colpo d'occhio qual è l'obiettivo del codice non è così
semplice, in questo caso.

Il problema è che i costrutti per definire i loop sono generici, quindi per
interpretare quello che fa un ciclo (for o while che sia)
dobbiamo mentalmente eseguirlo. Se questo può richiedere poco sforzo per un
ciclo semplice come quello visto nel primo esempio, potrebbe richiedere
qualche minuto per operazioni più complesse, come in quest'ultimo esempio (che,
per inciso, ordina i libri per autore utilizzando una
versione di base dell'algoritmo href="https://it.wikipedia.org/wiki/Bubble_sort">bubble sort).

In generale, i cicli possono essere difficili da interpretare e pertanto
sono abbastanza predisposti a bug. Si pensi ad un semplice errore di
distrazione nella gestione di un contatore. Contatori, peraltro, che
rappresentano lo stato dell'elaborazione corrente e vengono modificati
tramite un effetto collaterale. Infatti, un ciclo non è altro che una
sequenza di operazioni eseguite fino a quando lo stato dell'applicazione o
lo stato locale non raggiunge un determinato valore. Nei nostri esempi lo
stato è rappresentato dalle variabili contatore il cui valore varia ad ogni
iterazione.

Possiamo migliorare un po' la leggibilità del codice e mascherare la
gestione dello stato utilizzando il metodo forEach() degli array,
come mostrato nel seguente esempio:

var libriDiSalgari = [];
libri.forEach(function(libro) {
   if (libro.autore == "Emilio Salgari") {
      libriDiSalgari.push(libro);
   }
});

In questo caso evitiamo lo sforzo di dover prendere in considerazione la
variabile contatore e ci concentriamo sulla funzione eseguita su ciascun
elemento dell'array. Il metodo forEach()
ci consente di sfruttare il supporto alle funzioni di ordine superiore e ci
rende più chiaro l'intento del nostro codice, ma non applica un approccio
funzionale. Infatti esso non restituisce un valore, cioè non è una vera e
propria funzione, e il suo funzionamento si basa ancora pesantemente su un
effetto collaterale: quello che modifica l'array libriDiSalgari.

Nella prossima lezione vedremo meglio quali altri metodi ci vengono messi a disposizione da JavaScript per elaborare array con un approccio funzionale.


Ti consigliamo anche