Programmazione funzionale in PHP

//Programmazione funzionale in PHP

Programmazione funzionale in PHP

La programmazione funzionale sta acquisendo sempre più popolarità. Tanti linguaggi basati su questo paradigma stanno venendo alla ribalta. Il PHP non è un linguaggio funzionale ma a partire dalla versione 5.3 ha introdotto gradualmente una serie di costrutti che supportano questo paradigma. La programmazione funzionale in PHP permette di migliorare il codice rendendolo più leggibile e di conseguenza più mantenibile. Ma cos’è la programmazione funzionale?

Cos’è la programmazione funzionale?

La programmazione funzionale (functional programming) è un paradigma di programmazione basato sul concetto di funzioni matematiche. Si definisce funzione matematica quella legge che associa ad ogni elemento di un insieme A uno ed un solo elemento dell’insieme B. La programmazione funzionale permette di realizzare software composto da funzioni pure (pure functions) ovvero funzioni prive di effetti collaterali che per un determinato input restituiscono sempre il medesimo output. Si evitano quindi stati condivisi (shared state), dati mutabili (mutable data) ed effetti collaterali (side-effects).
Quali sono i benefici della programmazione funzionale? Sono tanti ma a mio avviso i principali sono la semplicità nel debugging e nel testing, la robustezza, la leggibilità e l’efficienza nella parallelizzazione. Inoltre programmazione funzionale incoraggia implicitamente a riutilizzare il codice (DRY) e a suddividere le responsabilità (SRP).

Programmazione Procedurale vs programmazione funzionale

In entrambi i paradigmi troviamo il concetto di funzione tuttavia tuttavia in ambito procedurale le funzioni non godono delle proprietà delle funzioni matematiche. Ciò vuol dire che nella programmazione procedurale, data una funzione, non c’è una diretta correlazione tra input ed output, ovvero l’esecuzione di della stessa funzione potrebbe produrre degli effetti collaterali per cui a fronte degli dello stesso input il risultato potrebbe essere diverso. La programmazione funzionale è dichiarativa mentre quella procedurale è imperativa.

La programmazione funzionale non è la panacea di tutti i mali, ci sono contesti in cui risulta più adatta di quella procedurale e viceversa. Per questa ragione sono stati sviluppati linguaggi funzionali di 2 tipi: puri e impuri. La prima categoria di linguaggi supporta solo il paradigma funzionale, la seconda invece supporta entrambi i paradigmi. Pur non essendo un linguaggio funzionale, il PHP ci permette di godere dei benefici di questo paradigma. Come?

Funzioni come first class citizen

PHP permette di assegnare una funzione ad una variabile:

Copy to Clipboard

E’ inoltre possibile restituire una funzione come risultato di una funzione:

Copy to Clipboard

Le funzioni possono anche essere passate come parametri:

Copy to Clipboard

In matematica, una funzione che può prendere altre funzioni come parametri e/o restituire funzioni come risultato viene detta una funzione di ordine superiore (o funzione higher-order). Lo stesso termine viene utilizzato nella programmazione funzionale, ma è bene sottolineare il fatto che le funzioni di ordine superiore furono inizialmente studiate dalla teoria del lambda calcolo ben prima che comparissero nei linguaggi di programmazione con i linguaggi funzionali.

In PHP è anche possibile trattatare oggetti come funzioni grazie al magic method __invoke:

Copy to Clipboard

Nella versione 5.4 di PHP è stato introdotto il typehint callable proprio per verificare che il contenuto di una variabile sia invocabile come una funzione, indipendentemente dal fatto che si tratti di un oggetto invocabile o di una funzione. In che modo queste caratteristiche del linguaggio tornano utili nella quotidianità?

Approccio funzionale alla manipolazione degli array

I cicli (for, foreach, do while, etc…) sono imperativi, fanno uso di variabili temporanee e non sono molto leggibili. Vediamo come possiamo farne a meno seguendo un approccio funzionale.

Negli esempi che seguono eseguiremo delle operazioni su un array che contiene la lista delle 5 più grandi città italiane:

Copy to Clipboard

Filtering

Supponiamo di voler estrarre la lista delle città con più di un milione di abitanti. Vediamo come fare applicando entrambi i paradigmi:

Copy to Clipboard

Reducing

Vediamo come generare una tabella HTML contenente i dati delle città:

Copy to Clipboard

Probabilmente i benefici dell’approccio funzionale in questo caso sembrano meno evidenti ma si pensi al fatto che la funzione di rendering potrebbe essere più complessa. Inoltre la funzione di rendering potrebbe essere utilizzata altrove oppure combinata con altre.

Mapping

Anche il mapping è un’operazione estremamente comune. Vediamo come mappare la nostra lista di città in un array chiave valore:

Copy to Clipboard

Possiamo inoltre riutilizzare le funzioni definite in precedenza in altri contesti e addirittura combinarle per ottenere nuovi risultati. Vediamocome ottenere un array delle città con più di un milione di abitanti:

Copy to Clipboard

I tre esempi mostrano come un’approccio funzionale ci permette di fare a meno dei cicli, ovvero niente più indici e variabili temporanee. I risultato è sicuramente un codice più leggibile e compatto.

Conclusione

PHP non è un linguaggio nato con l’intento di essere utilizzato secondo il paradigma funzionale. Tuttavia quando è appropriato, l’utilizzo di questo paradigma permette di scrivere codice più semplice, leggibile e testabile.
Perché dovresti iniziare ad applicare queste tecniche al più presto? Un proverbio cinese dice che “Imparare è come remare controcorrente: se smetti, torni indietro“. Dato che linguaggi e paradigmi si evolvono continuamente noi programmatori non possiamo permetterci il lusso di smettere di imparare. Imparando queste semplici tecniche svilupperai le tue capacità di problem solving e magari inizierai a pensare un po’ meno procedurale e sempre più funzionale!

By |2018-11-26T19:36:34+00:00novembre 26th, 2018|PHP|0 Comments

About the Author:

Mi chiamo Patrick e sono uno Sviluppatore Software. Prediligo cimentarmi nello sviluppo backend ma non disprezzo il frontend. La mia più grande passione è imparare: amo studiare e apprendere cose nuove ogni giorno.

Leave A Comment