In den letzten Jahren wurden die Sprachen, die ich gerne benutze, immer "funktionaler". Ich benutze jetzt Sprachen, die eine Art "Hybrid" sind: C #, F #, Scala. Ich entwerfe meine Anwendung gerne mit Klassen, die den Domänenobjekten entsprechen, und verwende Funktionsmerkmale, die das Codieren einfacher, übereinstimmender und sicherer machen (insbesondere beim Bearbeiten von Sammlungen oder beim Übergeben von Funktionen).
Die beiden Welten "kollidieren" jedoch, wenn es darum geht, Muster zu entwerfen. Das spezifische Beispiel, mit dem ich kürzlich konfrontiert wurde, ist das Beobachtermuster. Ich möchte, dass ein Produzent einen anderen Code benachrichtigt (die "Verbraucher / Beobachter", z. B. einen DB-Speicher, einen Logger usw.), wenn ein Artikel erstellt oder geändert wird.
Ich habe es anfangs "funktional" so gemacht:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Aber ich frage mich jetzt, ob ich einen "OO" -Ansatz verwenden soll:
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
Welches sind die Vor- und Nachteile der beiden Ansätze? Ich hörte einmal einen FP-Guru sagen, dass Designmuster nur aufgrund der Einschränkungen der Sprache vorhanden sind, und deshalb gibt es in funktionalen Sprachen so wenige. Vielleicht könnte dies ein Beispiel dafür sein?
EDIT: In meinem speziellen Szenario brauche ich es nicht, aber ... wie würden Sie das Entfernen und Hinzufügen von "Beobachtern" auf funktionale Weise implementieren? (Dh wie würden Sie alle Funktionen im Muster implementieren?) Übergeben Sie beispielsweise nur eine neue Funktion?