Nos últimos anos, os idiomas que eu gosto de usar estão se tornando cada vez mais "funcionais". Agora uso linguagens que são uma espécie de "híbrido": C #, F #, Scala. Eu gosto de projetar meu aplicativo usando classes que correspondem aos objetos do domínio e usar recursos funcionais, onde isso torna a codificação mais fácil, mais coincidente e mais segura (especialmente quando se opera em coleções ou quando passa funções).
No entanto, os dois mundos "colidem" quando se trata de padrões de design. O exemplo específico que eu enfrentei recentemente é o padrão Observer. Quero que um produtor notifique algum outro código (os "consumidores / observadores", por exemplo, um armazenamento de banco de dados, um criador de logs e assim por diante) quando um item for criado ou alterado.
Inicialmente, eu fiz "funcionalmente" assim:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Mas agora estou pensando se devo usar uma abordagem mais "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
Quais são os prós e contras das duas abordagens? Uma vez ouvi um guru de FP dizer que os padrões de design existem apenas por causa das limitações da linguagem, e é por isso que existem tão poucas em linguagens funcionais. Talvez isso possa ser um exemplo disso?
EDIT: No meu cenário particular, não preciso disso, mas .. como você implementaria a remoção e adição de "observadores" da maneira funcional? (Ou seja, como você implementaria todas as funcionalidades do padrão?) Apenas passando uma nova função, por exemplo?