Negli ultimi anni, le lingue che mi piace usare diventano sempre più "funzionali". Ora uso linguaggi che sono una sorta di "ibrido": C #, F #, Scala. Mi piace progettare la mia applicazione usando classi che corrispondono agli oggetti del dominio, e utilizzare le funzionalità funzionali dove questo rende la codifica più facile, più coincidente e più sicura (specialmente quando si opera su collezioni o quando si passano le funzioni).
Tuttavia i due mondi "si scontrano" quando arrivano a schemi di progettazione. L'esempio specifico che ho affrontato di recente è il pattern Observer. Voglio che un produttore avvisi un altro codice (i "consumatori / osservatori", ad esempio un archivio DB, un registratore e così via) quando un articolo viene creato o modificato.
Inizialmente l'ho fatto "funzionalmente" in questo modo:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Ma ora mi chiedo se dovrei usare un approccio più "OO":
interface IItemObserver {
onNotify(Item)
}
class DBObserver : IItemObserver ...
class LogObserver: IItemObserver ...
producer.addObserver(new DBObserver)
producer.addObserver(new LogObserver)
producer.foo() //calls observer in a loop
Quali sono i pro ei contro dei due approcci? Una volta ho sentito un guru di FP dire che i modelli di design ci sono solo a causa delle limitazioni del linguaggio, ed è per questo che ci sono così pochi linguaggi funzionali. Forse questo potrebbe essere un esempio di questo?
EDIT: Nel mio particolare scenario non ne ho bisogno, ma .. come implementereste la rimozione e l'aggiunta di "osservatori" in modo funzionale? (Ad esempio, come implementeresti tutte le funzionalità nel modello?) Solo passando una nuova funzione, ad esempio?