2016-04-20 13 views
1

Gibt es irgendwelche Vorteile der Verwendung wisper gem über rails-observers?rails-observers vs wisper gem

Sie sehen beide auf den ersten Blick ähnlich aus, aber wisper scheint mehr von der Community unterstützt zu werden (basierend auf GH-Sternen, Commits und Releases). Gibt es signifikante Unterschiede zwischen ihnen?

Antwort

4

Schienenbeobachter leiden unter den gleichen Problemen wie ActiveRecord-Rückrufe, vor allem, dass sie nicht deaktiviert werden können. Mit ActiveRecord Callbacks verbinden Sie das Modell für immer mit dem, was im Callback referenziert wird, und welche Nebeneffekte beim Callback auftreten, geschieht immer unter allen Umständen. Nur mit Beobachtern wird das Problem wirklich verschoben.

Was ist, wenn wir unser Modell in einem Kontext verwenden wollen, den wir heute nicht voraussehen, in dem wir nicht möchten, dass der Beobachter zurückkommt?

Wenn Sie Stackoverflow für „Rails Rückrufe“, eine große Anzahl von die Ergebnisse beziehen sich auf der Suche nach Mitteln zu suchen den Rückruf in bestimmten Kontexten zu vermeiden Ausgabe. Es scheint fast, als ob Rails-Entwickler eine Notwendigkeit entdecken, Callbacks zu vermeiden, sobald sie ihre Existenz entdecken.

ref: http://samuelmullen.com/2013/05/the-problem-with-rails-callbacks/

Wisper (Haftungsausschluss, Autor hier) ermöglicht Publishern (zum Beispiel ein Modell) Ereignisse zu übertragen, wenn etwas Wichtiges passiert. Listener abonnieren die Publisher zur Laufzeit. Die Herausgeber und Abonnenten wissen nichts voneinander. Sie sind nicht abhängig voneinander, sondern hängen nur vom Ereignis ab.

Unsere Systeme haben notwendigerweise Abhängigkeiten zwischen Objekten, sie müssen kommunizieren. Wir möchten jedoch, dass diese Abhängigkeit so gering wie möglich ist, damit ein Objekt in Zukunft in verschiedenen Kontexten verwendet werden kann, die wir heute möglicherweise nicht vorhersehen können. Siehe auch Connascence für Beispiele von leichten/harten Abhängigkeiten.

Mit Wisper können Sie in verschiedenen Kontexten wählen, ob Sie einen Listener abonnieren möchten oder nicht.

Zum Beispiel könnte ich in einem Controller einige Listener abonnieren, aber in meinem Komponententest möchte ich vielleicht die Modellisolation testen, ohne dass diese Nebeneffekte auftreten. Ein anderes Beispiel könnte eine Rake-Aufgabe sein, bei der ich ein Modell speichern möchte, aber bestimmte Nebeneffekte vermeiden möchte. Oder ein Admin-Controller, wo ich etwas nicht möchte/sollte, was in anderen Kontexten nicht passieren sollte/sollte.

Schließlich hat Wisper built-in support für die asynchrone Ausstrahlung von Ereignissen, die Beobachter nicht tun, sie sind immer synchron.

+2

Danke für die Erklärung, kann es für andere nützlich sein, also schlage ich vor, es irgendwo in das Repository (README oder Wiki) aufzunehmen. Ich bin gerade von Rails Observer nach Wisper gewechselt :) – jmarceli