Decostruiamo questo aforisma con un esempio usando un codice esistente (la funzione di Fibonacci è la nostra banana qui). Userò qui C # e ML visto che ho incrociato le spade con questi in passato, ma lo stesso vale per praticamente qualsiasi OO e linguaggio funzionale.
Va notato che questi potrebbero essere stati raccolti in modo da essere praticamente identici. Ma sto cercando di identificare le differenze generali di approccio con ogni paradigma. Gli stili di sviluppo possono variare considerevolmente (nonostante gli standard di codifica della casa).
ML
fun fibonacci n =
if n < 3 then
1
else
fibonacci (n-1) + fibonacci (n-2)
C #
public static int Fibonacci(int n)
{
int a = 0;
int b = 1;
for (int i = 0; i < n; i++)
{
int temp = a;
a = b;
b = temp + b;
}
return a;
}
Quindi cosa sta succedendo qui. La prima cosa da notare è che ML non richiede dichiarazioni variabili (o tipi, sebbene li abbia). Questa è una caratteristica dei linguaggi funzionali. La valuta dei linguaggi funzionali è funzioni che rendono il codice molto conciso, altamente verificabile e riutilizzabile.
La seconda cosa è che i linguaggi funzionali si prestano molto bene alla ricorsione, facendo di nuovo codice più conciso. Gli sviluppatori OO potrebbero essere più inclini a utilizzare un loop qui. Questo non vuol dire che i linguaggi OO non facciano ricorsione (lontano da esso), ma questi devono essere creati con cura per fermare lo stack overflow e simili.
Che ne dici di test allora? Bene, qui il contrasto è ancora più strong:
ML
fibonacci (10)
C #
Console.WriteLine(MyClass.Fibonacci(10));
Poiché la valuta dei linguaggi funzionali è la funzione, il risultato viene semplicemente restituito (in quanto può esso stesso inserirsi in una funzione). Con C # la classe (o la sua istanza) deve essere referenziata (un gorilla). Abbiamo anche bisogno di un codice ( Console.WriteLine
) per segnalare il risultato al mondo esterno (una foresta).
Gorilla e foresta potrebbero ugualmente essere altre cose come oggetti che devi costruire per arrivare alla banana, e spazi dei nomi ecc. Il punto è che ci sono degli strati che devono essere navigati per arrivare alla banana.