Durante un’intervista questa settimana mi è stato chiesto “qual è la differenza tra Programmazione Funzionale, Object-Oriented e Procedurale” e ad essere onesti non sapevo bene come rispondere a questa domanda (ed era la prima volta che sentivo parlare di Programmazione Procedurale…). Così oggi, ho deciso di fare qualche ricerca e (cercare di) capire quali sono le principali differenze.
Iniziamo con alcune definizioni:
” La programmazione funzionale (FP) è un paradigma di programmazione – uno stile di costruire la struttura e gli elementi dei programmi per computer – che tratta la computazione come la valutazione di funzioni matematiche ed evita i dati mutevoli e a stato variabile.” – Wikipedia
” La programmazione orientata agli oggetti (OOP) è un paradigma di programmazione basato sul concetto di “oggetti”, che possono contenere dati, sotto forma di campi, spesso noti come attributi; e codice, sotto forma di procedure, spesso note come metodi.” – Wikipedia
” La programmazione procedurale è un paradigma di programmazione, derivato dalla programmazione strutturata, basato sul concetto di chiamata di procedura. Le procedure, note anche come routine, subroutine o funzioni, contengono semplicemente una serie di passi di calcolo da eseguire.” – Wikipedia
Ok, questa è un’introduzione ma entriamo un po’ più nel dettaglio.
Prima di tutto, cos’è un paradigma di programmazione? È uno stile di programmazione, un modo di pensare alla costruzione del software. Un paradigma di programmazione non si riferisce ad un linguaggio specifico ma piuttosto ad un modo di programmare, una metodologia. Alcuni linguaggi rendono facile scrivere in alcuni paradigmi ma non in altri. Per maggiori dettagli, si veda l’articolo di Wikipedia.
Ora immergiamoci nei tre paradigmi di programmazione che ci interessano oggi:
La programmazione procedurale (PP), conosciuta anche come programmazione in linea ha un approccio top-down. Si tratta di scrivere una lista di istruzioni per dire al computer cosa fare passo dopo passo. Si basa su procedure o routine.
La programmazione orientata agli oggetti (OOP) riguarda l’incapsulamento di dati e comportamenti in oggetti. Un’applicazione OOP userà una collezione di oggetti che sa come eseguire certe azioni e come interagire con altri elementi dell’applicazione. Per esempio un oggetto potrebbe essere una persona. Questa persona avrebbe un nome (che sarebbe una proprietà dell’oggetto), e saprebbe come camminare (che sarebbe un metodo). Un metodo in OOP può essere considerato come una procedura in PP, ma qui appartiene ad un oggetto specifico. Un altro aspetto importante di OOP sono le classi. Una classe può essere considerata come un progetto per un oggetto.
La programmazione funzionale (FP) riguarda il passaggio di dati da funzione a funzione a funzione per ottenere un risultato. Nella FP, le funzioni sono trattate come dati, il che significa che potete usarle come parametri, restituirle, costruire funzioni da altre funzioni e costruire funzioni personalizzate. Le funzioni in FP devono essere funzioni pure, dovrebbero evitare lo stato condiviso, e gli effetti collaterali e i dati dovrebbero essere immutabili. Una funzione pura è una funzione che dato lo stesso tipo di input restituirà sempre lo stesso output, non dipende da uno stato locale o globale. Uno stato condiviso è uno stato che è condiviso tra più di una funzione o più di una struttura di dati. Quindi, con lo stato condiviso, per capire gli effetti di una funzione, è necessario conoscere tutti i dettagli di ogni variabile condivisa. Aggiunge molta complessità e permette una minore modularità.