Au cours des dernières années, les langues que j'aime utiliser sont de plus en plus «fonctionnelles». J'utilise maintenant des langages qui sont une sorte d '"hybride": C #, F #, Scala. J'aime concevoir mon application en utilisant des classes qui correspondent aux objets du domaine et utiliser des fonctionnalités fonctionnelles où cela rend le codage plus facile, plus coïncident et plus sûr (en particulier lors de l'utilisation de collections ou lors du passage de fonctions).
Cependant, les deux mondes se "heurtent" quand il s'agit de concevoir des modèles. L'exemple spécifique que j'ai rencontré récemment est le modèle Observer. Je veux qu'un producteur notifie un autre code (les "consommateurs / observateurs", par exemple un stockage de base de données, un enregistreur, etc.) lorsqu'un élément est créé ou modifié.
Au départ, je l'ai fait "fonctionnellement" comme ceci:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Mais je me demande maintenant si je devrais utiliser une approche plus "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
Quels sont les avantages et les inconvénients des deux approches? J'ai entendu un jour un gourou de la FP dire que les modèles de conception n'étaient là qu'en raison des limites du langage, et c'est pourquoi il y en a si peu dans les langages fonctionnels. Peut-être que cela pourrait en être un exemple?
EDIT: Dans mon scénario particulier, je n'en ai pas besoin, mais .. comment implémenteriez-vous la suppression et l'ajout "d'observateurs" de manière fonctionnelle? (C'est-à-dire comment implémenteriez-vous toutes les fonctionnalités du modèle?) Juste passer une nouvelle fonction, par exemple?