Negli ultimi anni, le lingue che mi piace usare stanno diventando 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 di dominio e utilizzare funzionalità funzionali che rendono la codifica più semplice, più coincidente e più sicura (specialmente quando si opera su raccolte o quando si passano funzioni).
Tuttavia i due mondi si "scontrano" quando si tratta di progettare modelli. L'esempio specifico che ho affrontato di recente è il modello Observer. Voglio che un produttore notifichi un altro codice (i "consumatori / osservatori", diciamo un archivio DB, un logger e così via) quando un oggetto 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 e i contro dei due approcci? Una volta ho sentito un guru del FP dire che i modelli di progettazione esistono solo a causa delle limitazioni del linguaggio, ed è per questo che ci sono così pochi nei linguaggi funzionali. Forse questo potrebbe esserne un esempio?
EDIT: Nel mio scenario particolare non ne ho bisogno, ma .. come implementeresti la rimozione e l'aggiunta di "osservatori" in modo funzionale? (Vale a dire come implementereste tutte le funzionalità nel modello?) Passando ad una nuova funzione, per esempio?