Hosting & Cloud

Programmazione funzionale e programmazione object-oriented

7 minuti lettura
Programmazione funzionale e object oriented

Un passo importante nel processo di sviluppo applicativo è rappresentato dalla scelta tra la programmazione funzionale e la programmazione object-oriented. Quest’ultima è sicuramente quella più diffusa e presente nella gran parte dei programmi volti all’insegnamento iniziale dell’attività di programmatore. Le due tipologie di linguaggio possono sembrare apparentemente simili, ma in realtà presentano delle differenze sostanziali. Nelle prossime righe si analizzeranno le differenze più rilevanti tra queste due tipologie di programmazione.

Cos’è la programmazione funzionale?

Quando ci si approccia alla programmazione funzionale (FP), ci si riferisce a quella metodologia che si comporta come le comuni funzioni matematiche, per esempio come la conversione da gradi Fahrenheit a quelli Celsius. Nel momento in cui vengono impartite le funzioni, con i medesimi input si ottiene sempre lo stesso risultato. Tale condizione viene denominata funzione pura, cioè capace di non produrre alterazioni particolari, restituendo di fatto il medesimo valore nel momento in cui viene utilizzata, senza modificare elementi esterni all’ambito dei parametri stabiliti inizialmente.

Per fare un esempio di programmazione funzionale basti pensare alla funzione di Google e del suo applicativo MapReduce. A seconda degli input di ricerca dell’applicativo e del set di dati impartito, Google restituirà la stessa risposta eseguendo la medesima funzione, in questo caso la ricerca effettuata.

Cos’è la programmazione object-oriented?

La programmazione object-oriented (OOP) ha capacità differenti, potendo inserire di fatto delle variabili dipendenti dallo stato, rendendo la ricerca meno vincolata ai valori di coerenza.

Per fare un esempio basti pensare alla creazione di un modulo per lo stipendio, nel momento in cui questo viene fissato con un valore di 5000 euro, con la OOP è possibile aggiungere variabili statiche globali come la percentuale. Nell’esempio di cui sopra, una variabile del +10% modifica il modello da 5000 euro a 5500 euro.

Affinché si possano aggiungere stati, l’FP è utilizzato principalmente con il linguaggio di programmazione non funzionale, come per esempio F#, con cui è possibile sommare funzioni usualmente non presenti in un programma tradizionale.

Esempi di FP e OOP

Per rendere il ragionamento più intuitivo è opportuno riportare un esempio pratico, per velocizzare la comprensione del testo utilizzeremo prima un esempio per la programmazione funzionale utilizzando il comunissimo FizzBuzz in F#. Da un punto di vista tecnico, FizzBuzz non è altro che un test di codifica in cui viene creato un software che ha la capacità di stampare serie di numeri e lettere regolati da un insieme di regole. Nel caso in cui il numero di riferimento fosse divisibile per 3, è opportuno stampare la parola Fizz al suo posto. Per i numeri divisibili per 5, invece, si sostituisce la parola Buzz. Nella condizione in cui il numero fosse divisibile sia per 5 che per 3, si stampa FizzBuzz. Stilizzando un linguaggio di programmazione funzionale, sempre basato su F#, tale procedimento può essere sviluppato come funzioni.

Utilizzando invece una programmazione object-oriented con C# come linguaggio principale, vi è un ragionamento simile, ma non identico. La differenza risiede nel fatto che nel caso della OOP tutte le informazioni sono contenute in un oggetto, quest’ultimo capace di racchiudere il numero corrente dei cicli come vera e propria variabile. I vantaggi in questo caso sono evidenti e si identificano principalmente in un’interfaccia molto più semplice da utilizzare e un’automazione temporale nel caso in cui si aggiungessero delle variabili al codice, come nell’esempio del modello dello stipendio.

Tecnicamente il programmatore con la programmazione object-oriented potrebbe sviluppare un codice che faccia andare in loop il sistema e cambiare le logiche di runtime a seconda delle regole cambiate nel tempo. L’ingegnere Steve Poling creò un’implementazione tra OOP in C# di FizzBuzz, rendendolo di fatto riutilizzabile a seconda delle esigenze.

FP e OOP: casi d’utilizzo

Sebbene le due tipologie di programmazione abbiano delle affinità, anche se con modalità di approccio diverse, è interessante analizzare quelli che sono i casi di utilizzo di uno o dell’altro linguaggio nella pratica.

Quando si utilizza una programmazione object-oriented, usualmente questa è impiegata per la progettazione dell’interfaccia dell’utente. Tutte le finestre che compaiono a schermo sono composte da caselle di testo, pulsanti e modelli che cambiano in tempo reale a seconda di ciò che l’utente digita a schermo. Nel caso in cui il layout originario di un modello sia disponibile, qualsiasi programmatore può accedervi e impiegare il codice per modificarlo in base alle sue esigenze con lo shell di riempimento. Nell’atto pratico la programmazione funzionale è la soluzione migliore quando l’applicativo si caratterizza di funzioni che si innestano una sull’altra.

Combinare programmazione funzionale e programmazione object-oriented

Come è facile dedurre, la realizzazione di un codice OOP comporta una serie di svantaggi legati principalmente alla complessità della sua gestione nel tempo. La proceduralità di tale programmazione può compromettere di fatto la modifica del codice quando particolarmente complesso, costringendo il programmatore a una riscrittura completa. La difficoltà diventa ancora più rilevante quando bisogna testare o effettuare delle operazioni di debug di oggetti che modificano altri oggetti, magari basati su database esterni. Nel momento in cui si presentassero degli errori, il programmatore difficilmente potrebbe identificare tutti gli oggetti, essendo impossibilitato a replicarli. Sebbene vi possano adottare delle tecniche utili, come il design pattern, le limitazioni sono comunque troppo rilevanti.

Prendendo in considerazione la programmazione funzionale, le criticità appaiono diverse. Le principali sono riscontrabili in una difficoltà evidente nell’impararla e nel metterla in pratica. Quando ci si approccia alla programmazione funzionale bisogna necessariamente pensare al codice con molta attenzione, mettendo in conto che il tempo e i dettagli sono componenti indispensabili per ottenere dei risultati significativi.

La grande difficoltà della FP può essere ridotta con un compromesso, cioè utilizzando un approccio funzionale che si focalizzi sulla creazione di una piccola parte di un applicativo più grande. Tale strategia è particolarmente indicata per i codici che prendono dati e producono risultati in batch. Sebbene possa sembrare strano, è possibile anche aggiungere stati ai FP grazie all’utilizzo di programmazioni non funzionali, come F#. Condizione che si estende alla possibilità di aggiungere funzioni a programmi che si basano su linguaggi tradizionali, su programmazione object-oriented.

Per esempio, considerando linguaggi di programmazione come Java e C#, questi nelle versioni più aggiornate possiedono specifiche che garantiscono un approccio funzionale, implementando di fatto il codice F# che viene a interagire con C#. Tale processo avviene attraverso il common language runtime.

FP e OOP: quali sono le differenze più evidenti?

Per quanto gli esempi possano essere esplicativi, le differenze riscontrabili tra una programmazione funzionale e una object-oriented sono da ricercare nel confronto delle funzionalità.

  • Dati: quando si utilizza una programmazione funzionale si utilizzano dati immutabili, cioè informazioni di codice che una volta determinate non possono essere modificate da variabili esterne. Tale condizione induce il programmatore a stabilire un modello che possa essere utilizzato per specifiche esigenze. Per quanto concerne i dati della programmazione a oggetti, questa orienta i modelli utilizzando dati mutabili. Il codice, quindi, viene a essere il trampolino di lancio per alterazioni future, siano queste basate su variabili globali oppure di natura diversa.
  • Modello: utilizzando una programmazione funzionale si segue un modello dichiarativo. La programmazione dichiarativa costringe i programmatori a decidere, prima di iniziare a sviluppare il codice, quale linguaggio di programmazione utilizzare. Tale condizione evidenzia come sia indispensabile raggiungere il risultato finale, senza necessariamente mostrare tutte le fasi di lavoro. Condizione diversa, invece, per i modelli di programmazione a oggetti, che seguono un iter di programmazione imperativo.
  • Supporto: uno degli aspetti spesso sottovalutati dai programmatori è il supporto, caratteristica che può fare la differenza quando si ha la necessità di utilizzare anche la programmazione parallela. Da un punto di vista tecnico, la programmazione funzionale supporta la programmazione parallela, mentre una programmazione object-oriented non ha alcun supporto alla programmazione parallela. Sebbene tale differenza possa sembrare di poco conto, per i progetti su ampia scala può essere una condizione determinante nella scelta di uno o dell’altro sistema di sviluppo dell’applicativo.
  • Esecuzione: come già sottolineato nelle righe precedenti, quando si programma un codice con una programmazione funzionale oppure a oggetti, l’esecuzione è completamente diversa. Una programmazione funzionale stabilisce delle istruzioni che possono essere eseguite nell’ordine che si preferisce, mentre nella programmazione object-oriented è indispensabile effettuare le dichiarazioni seguendo un ordine specifico. I vantaggi e gli svantaggi in questo caso risiedono nell’obiettivo che il programmatore ha. La gestione di una programmazione di un ordine particolare necessita di maggior tempo per l’esecuzione dei test, ma in molti casi dipende dall’applicativo in sviluppo e dalla pianificazione effettuata dal programmatore stesso.
  • Iterazioni: quando si utilizza una programmazione funzionale, per i dati iterativi viene utilizzata la ricorsione. Considerando invece una programmazione a oggetti, i dati iterattivi sono vincolati ai loop. Utilizzare i loop per le attività di iterazione è in molti casi utile per migliorare nel tempo il codice, ma tale condizione può essere controproducente nel momento in cui bisogna modificare il codice dopo un’infinità di variabili significative.
  • Elemento: nella object-oriented, gli elementi base sono gli stessi oggetti e metodi, mentre nella programmazione funzionale gli elementi base rappresentano funzioni e variabili. L’utilizzo di un sistema piuttosto che l’altro induce il programmatore ad avere un approccio completamente diverso. La capacità di scrivere un codice ben definito con la programmazione OOP necessita di un tempo maggiore poiché bisogna lavorare sugli oggetti stessi.
  • Uso: la FP viene utilizzata nel momento in cui si presentano poche condizioni con più operazioni; mentre la programmazione a oggetti viene principalmente impiegata quando vi sono molteplici condizioni con poche operazioni.

Programmazione funzionale e object-oriented, quale scegliere?

Analizzando le differenze tra le due metodologie di programmazione, è evidente dedurre che non vi sia una soluzione migliore dell’altra. Da un punto di vista lavorativo hanno entrambe il compito di fornire un codice privo di errori, gestito e modificato nel miglior modo possibile dai programmatori di terze parti.

Sebbene la programmazione object-oriented e quella funzionale abbiano una concezione completamente diversa per l’archiviazione e la manipolazione dei dati, è opportuno identificare il proprio modo di lavorare prima di scegliere una piuttosto che l’altra. Molti programmatori preferiscono memorizzare i dati in oggetti creando funzioni, altri invece ritengono più appropriato memorizzare i dati negli oggetti stessi. Sicuramente la programmazione a oggetti guarda a un futuro volto all’interazione con altri elementi, poiché non vi è la necessità di ulteriori modelli per potersi attivare.

Come sottolineato in precedenza, la scelta di un sistema rispetto all’altro è da ricercare nelle proprie esigenze e in quella dell’applicativo di riferimento. Nel caso in cui il software da sviluppare non abbia la necessità di interagire con altri modelli, una soluzione funzionale può essere la scelta migliore; nella condizione in cui più modelli e oggetti devono correlarsi tra loro, sebbene la programmazione risulti più complessa, sarebbe opportuno virare su una programmazione object-oriented.

Amiamo la programmazione e il nostro team Sviluppo ha realizzato il Pannello Manager, un’area riservata ai clienti per la gestione completa di tutti i servizi da un’unica interfaccia. In particolare, potrai acquistare e rinnovare tutti i tuoi servizi e chiedere assistenza in modo rapido.

Troverai numerose funzioni per gestire ogni servizio nel dettaglio, potrai ad esempio: vedere i dati FTP del tuo spazio Hosting, gestire le quote di posta delle tue caselle email, gestire i DNS, monitorare le statistiche CPU, RAM e disco o cambiare il tuo piano Hosting in pochi click.

Avatar photo
461 articoli

Note sull'autore
Appassionata di comunicazione digitale, in Shellrent scrivo e condivido contenuti tecnici, informativi e novità del mondo IT. Fuori dall'ufficio mi divido tra stadi, montagna e altri angoli del mondo.
Articoli
Articoli correlati
Hosting & Cloud

VPS economico: flessibilità e prestazioni a basso costo

2 minuti lettura
L’evoluzione tecnologica degli ultimi anni si è riversata anche sul mondo dei server virtuali privati (VPS), portando sul mercato soluzioni sempre più…
Hosting & Cloud

Hosting web o VPS: qual è la soluzione migliore?

4 minuti lettura
L’infrastruttura di hosting è un elemento cruciale per determinare la performance di siti e applicazioni web. In questo approfondimento metteremo a confronto…
Hosting & Cloud

Che cosa si intende per alta affidabilità (HA)

4 minuti lettura
In ambito IT la nozione di alta affidabilità fa riferimento alla capacità di un sistema o componente di garantire la continua disponibilità…