2016-04-20 36 views

回答

4

Rails觀察者遇到與ActiveRecord回調相同的問題,主要是他們無法關閉。使用ActiveRecord回調函數,您將模型永久地耦合到回調中引用的任何內容,並且回調中出現的任何副作用總是在所有情況下發生。使用觀察員只能真正解決問題。

如果我們想在上下文中使用我們的模型(我們今天沒有預見到,我們不希望發生觀察者回調),該怎麼辦?

如果你搜索的StackOverflow的「Rails的回調」,大量的 結果涉及到尋找辦法,以避免發出回調 某些情況下。幾乎看起來Rails開發人員發現 需要儘快避免回調。

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

Wisper(免責聲明,這裏筆者),發佈商(例如模型)當事情發生顯著廣播事件。監聽器在運行時被訂閱到發佈者。出版商和訂閱者彼此不知情。他們不依賴彼此,而只依賴於事件。

我們的系統必須具有對象之間的依賴關係,它們需要進行通信。然而,我們希望這種依賴性儘可能小,以便將來可以在不同情況下使用對象,而這些對象我們目前可能無法預見。另請參閱Connascence以瞭解輕量級/硬性依賴性的示例。

使用Wisper,在不同的上下文中,您可以選擇是否訂閱偵聽器。

例如在控制器中,我可能會訂閱一些監聽器,但在我的單元測試中,我可能想要測試模型隔離,而不會發生這些副作用。另一個例子可能是一個耙子任務,我想保存一個模型,但不希望發生某些副作用。或者一個管理員控制器,我想/不想在其他情況下發生/不應該發生的事情。

最後,Wisper有built-in support用於觀察者不需要的事件的異步廣播,它們總是同步的。

+2

感謝您的解釋,它可能對其他人有用,所以我建議將它包含在存儲庫(README或Wiki)中的某個位置。我剛剛從Rails Observers切換到Wisper :) – jmarceli