Conosci la Programmazione Funzionale?

  



La programmazione funzionale è un paradigma che si concentra sull'uso delle funzioni per risolvere i problemi, trattando i dati come immutabili e cercando di evitare effetti collaterali. 

🔗 Ti piace Techelopment? Dai un’occhiata al sito per tutti i dettagli!

Programmazione Funzionale

La principale caratteristica della programmazione funzionale è che le funzioni sono trattate come cittadini di prima classe. Ciò significa che le funzioni possono essere passate come argomenti ad altre funzioni, restituite da altre funzioni e assegnate a variabili, proprio come qualsiasi altro tipo di dato.

Nel contesto della programmazione funzionale, le funzioni inline giocano un ruolo fondamentale. Una funzione inline è una funzione definita direttamente all'interno del codice, che può essere passata come parametro ad altre funzioni o utilizzata in modo immediato. Ciò rende il codice più conciso, modulare e facilmente leggibile, in quanto riduce la necessità di definire funzioni separate, favorendo una scrittura più espressiva e orientata agli scopi specifici.


Programmazione Tradizionale (Imperativa) vs Programmazione Funzionale

Per comprendere meglio cosa significa la programmazione funzionale, vediamo un confronto pratico tra un approccio tradizionale (imperativo) e uno funzionale in un linguaggio come JavaScript.

Esempio con Programmazione Tradizionale (Imperativa)

Immagina di voler sommare tutti i numeri di un array che sono maggiori di 10.

In un approccio imperativo, il programmatore deve gestire esplicitamente il flusso di controllo, modificare variabili di stato e iterare attraverso l'array manualmente. Un esempio potrebbe essere il seguente:


const numbers = [5, 12, 8, 130, 44];
let sum = 0;

// Explicit iteration with for loop
for (let i = 0; i < numbers.length; i++) {
  if (numbers[i] > 10) {
    sum += numbers[i];  // add to sum
  }
}

console.log(sum);  //Output: 186

In questo caso:

  • Il flusso di esecuzione è controllato manualmente tramite il ciclo for.

  • L'array numbers viene iterato, e la somma viene modificata esplicitamente all'interno del ciclo.

  • Il codice è verboso e non particolarmente dichiarativo. Inoltre, si fa uso di una variabile di stato (sum) che viene modificata nel corso dell'esecuzione.

Esempio con Programmazione Funzionale

In un approccio funzionale, invece, il programmatore tende a concentrarsi su operazioni che trasformano i dati in modo dichiarativo, spesso utilizzando funzioni inline e metodi come .filter() e .reduce() che astraggono la logica imperativa.

Lo stesso esempio di sommare i numeri maggiori di 10 usando un approccio funzionale potrebbe essere scritto in questo modo:


const numbers = [5, 12, 8, 130, 44];

// Using filter and reduce
const sum = numbers
  .filter(num => num > 10)  // filter numbers greater than 10
  .reduce((acc, num) => acc + num, 0);  // Sum of filtered numbers

console.log(sum); //Output: 186

In questo caso:

  • Il flusso di esecuzione è astratto tramite funzioni di ordine superiore (filter e reduce), senza dover scrivere cicli espliciti.

  • Funzioni inline: la funzione di filtraggio num => num > 10 è definita direttamente all'interno del metodo filter, e la funzione di somma (acc, num) => acc + num è passata inline al metodo reduce. Questo rende il codice più compatto e leggibile.

  • Non c'è la necessità di gestire manualmente variabili di stato come la somma; tutto è gestito in modo immutabile.


Un momento...perchè abbiamo scritto le funzioni inline con quella sintassi strana?

In realtà non è una sintassi strana ma semplicemente il modo in cui dalla versione di JavaScript ES6 è possibile scrivere le funzioni anonime utilizzando la notazione arrow function. Per approfondire puoi leggere l'articolo Le famose lambda functions (aka arrow functions).


Caratteristiche principali della programmazione funzionale

  1. Immutabilità: I dati non vengono modificati direttamente. Ogni operazione su una struttura dati crea una nuova struttura senza alterare quella originale. Ad esempio, filter e reduce restituiscono nuovi array o valori senza modificare l'array originale.

  2. Funzioni di ordine superiore: Le funzioni possono essere passate come parametri ad altre funzioni, restituite da altre funzioni o utilizzate inline. Questo è un concetto fondamentale della programmazione funzionale, che permette di scrivere codice più espressivo e modulare.

  3. Funzioni pure: Le funzioni devono essere pure, ovvero non devono avere effetti collaterali (non devono modificare variabili globali o lo stato dell'applicazione) e devono restituire lo stesso risultato dato lo stesso input. Questo rende il codice più prevedibile e facile da testare.

  4. Composizione delle funzioni: Le funzioni possono essere combinate insieme in modo elegante. Ad esempio, nel codice sopra, filter e reduce sono usati in sequenza, con il risultato di uno che diventa l'input per l'altro. Questo è un esempio di composizione delle funzioni.


Vantaggi della Programmazione Funzionale

  1. Codice più conciso e leggibile: L'uso di funzioni inline e metodi di ordine superiore rende il codice più compatto e chiaro. Non c'è bisogno di gestire manualmente cicli o variabili di stato, il che riduce il rischio di errori e rende il codice più facile da comprendere.

  2. Migliore modularità: Le funzioni pure e la composizione delle funzioni permettono di creare componenti che possono essere facilmente riutilizzati. Ogni funzione è autonoma e indipendente, rendendo il codice più facilmente manutenibile.

  3. Migliore gestione degli errori: Poiché le funzioni pure non hanno effetti collaterali, è più facile tracciare gli errori e prevedere come si comporta il sistema. Le funzioni non cambiano lo stato globale, quindi si riduce la probabilità di introdurre bug legati a modifiche indesiderate dello stato.

  4. Facilità di testing: Le funzioni pure sono più facili da testare poiché, dato un input, producono sempre lo stesso output, senza dipendere dallo stato esterno.


Conclusione

La programmazione funzionale offre una prospettiva diversa rispetto alla programmazione tradizionale. Mentre la programmazione imperativa si concentra su come eseguire le operazioni, la programmazione funzionale si concentra su cosa fare, astrando il flusso di esecuzione e rendendo il codice più dichiarativo. 

Utilizzando funzioni inline, il codice diventa più conciso, leggibile e manutenibile, con una maggiore separazione delle preoccupazioni.


Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment