Ho usato f # e Haskell per imparare la programmazione funzionale per un po 'di tempo. Fino a quando non posso ottenere l'approvazione f # nella nostra azienda, devo ancora usare C#. Sto ancora cercando comunque di rimanere nello stile funzionale, come ho notato diversi vantaggi.Da OO alla programmazione funzionale a 10.000 piedi
Ecco un problema tipico.
- V'è una tabella di chiavi set nel database con 3 chiavi (6,5 milioni righe)
- Ci sono altre 4 supportano tavoli di piccole e medie dimensioni.
- Esistono formule complesse basate su diversi input.
Devo utilizzare i dati di tutti i precedenti per calcolare un valore e associarlo a ciascuna riga dell'insieme di tasti e inviarlo al database. Ci sono molte ricerche sugli altri 4 tavoli. Per motivi di prestazioni è tutto fatto in memoria.
So esattamente come farei l'in OO con dizionari statici, modelli di oggetti, modelli di strategia e così via, ma in un modo funzionale non riesco a liberarmi del cattivo odore dell'utilizzo di alcuni di questi costrutti.
Attualmente sto facendo le seguenti ipotesi per una soluzione funzionale.
I dizionari statici sono negativi. Sembra che la funzione possa avere effetti collaterali.
Ho bisogno di una funzione Calcola, accetta un oggetto immutabile e restituisce un oggetto immutabile con le tre chiavi e il valore calcolato. All'interno di questa funzione potrebbe esserci un'altra funzione nello stesso stile.
I modelli OO tradizionali probabilmente non funzioneranno.
Come progettare questo ad alto livello?
Mi sbaglio? Ho perso qualcosa?
Dipende dalla lingua OO in questione. C# svolge un ottimo lavoro con tecniche funzionali. E alcune cose possono essere fatte in modo abbastanza funzionale in linguaggi OO più dolorosamente inflessibili come Java, ma in questo caso c'è sicuramente una buona dose di attrito cognitivo. – JasonTrue
Se si finisce per provare a fare qualcosa di funzionale e si trova nell'ambiente Java, probabilmente è meglio farlo in Clojure. Sebbene tecnicamente sia un linguaggio Lisp e non un linguaggio ML, può essere fatto per funzionare con applicazioni Java (genera un bytecode JVM) e supportare lo sviluppo di stili funzionali. –
C# cade piatto su molte tecniche funzionali.Inferenza di tipo estremamente limitata è solo un rompicapo. Prova a scrivere il tipo di una funzione che utilizza diversi parametri generici, come un dizionario di funzioni. Ahia. – MichaelGG