La programmazione funzionale è una strana bestia per me. Ho imparato F # e Haskell, ho scritto alcuni semplici programmi e adoro usarli, ma non ho mai avuto il "lampo di rivelazione" di cui alcune persone parlano. Ma lentamente, ho notato che sempre più stavo scrivendo codice che doveva essere immutabile, suddividendo le attività in funzioni più piccole e più piccole e cercando di usare i delegati molto di più. È una cosa che, se ti piace, si insinua nel tuo lavoro perché il valore di quelle tecniche è evidente.
Ora, più praticamente per l'allenamento: trovo che due concetti facciano davvero clic su Programmazione funzionale come stile per me.
Innanzitutto, lo stile FP si basa sulla struttura dei dati, non sulla composizione come in OOP. Ho visto qualcosa come List in C # come un trucco intelligente per generare elenchi sicuri, qualcosa che ha composto il tipo (stringa) nell'altro tipo (elenco). Dopo aver appreso FP, ora guardo ai generici più simili a Monadi. L'elenco è una forma strutturata che il codice può assumere e decora le stringhe.
In secondo luogo, e forse più utile per i programmatori C # / ASP, è l'idea che FP funzioni su ricorsione e ripetizione, mentre OOP lavora su mutabilità e loop. Tendo a pensare al ciclo di vita della pagina ASP come a una sorta di FP ora: ogni richiesta viene elaborata da zero attraverso l'intero ciclo di vita, quindi l'intera pagina è, in effetti, un grande programma che si ripete lentamente. Se riesci a restringere questa nozione, avrai un'idea migliore di come un programma imperativo può essere strutturato attorno a cicli di funzioni che accettano dati, operano su di esso e restituiscono nuovi dati invece di modificare il vecchio.
L'ostacolo più difficile, almeno per me, da superare con questo approccio è che l'affondamento della sensazione che stai sprecando tonnellate di risorse quando usi oggetti mutabili risparmierebbe un sacco di memoria. In GC ci fidiamo e ho dovuto imparare a lasciar andare i problemi di prestazioni fino a quando non ho visto il programma in esecuzione e verificato se ce n'erano addirittura, e in tal caso usare un profiler per vedere esattamente dove fossero i problemi.