rails-observers vs wisper gem

rails-observers vs wisper gem

使用 wisper gem over rails-observers 有什么好处吗?

乍一看,它们看起来非常相似,但 wisper 似乎更受社区支持(基于 GH 星级、提交和发布)。它们之间有什么显着差异吗?

Rails 观察者遇到与 ActiveRecord 回调相同的问题,主要是它们无法关闭。使用 ActiveRecord 回调,您可以永远将模型耦合到回调中引用的任何内容,并且回调中发生的任何副作用总是在所有情况下发生。使用观察者只会真正解决问题。

如果我们想在我们今天无法预见的上下文中使用我们的模型,我们不希望在其中发生观察者回调怎么办?

If you search Whosebug for “Rails callbacks”, a large number of the results pertain to seeking means to avoid issuing the callback in certain contexts. It almost seems as though Rails developers discover a need to avoid callbacks as soon as they discover their existence.

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

Wisper(免责声明,作者在此)允许发布者(例如模特)在重大事件发生时广播事件。侦听器在运行时订阅发布者。发布者和订阅者彼此之间一无所知。它们不是相互依赖,而是只依赖于事件。

我们的系统必然在对象之间存在依赖关系,它们需要进行通信。然而,我们希望这种依赖性尽可能轻,以便将来可以在我们目前可能无法预见的不同上下文中使用对象。有关 light/hard 依赖项的示例,另请参阅 Connascence

使用 Wisper,在不同的上下文中您可以选择订阅或不订阅监听器。

例如,在控制器中,我可能会订阅一些侦听器,但在我的单元测试中,我可能想测试模型隔离,而不会发生这些副作用。另一个例子可能是 rake 任务,我想在其中保存模型但不希望发生某些副作用。或者我 do/don 不想要在其他情况下 should/shouldn 不会发生的事情的管理控制器。

最后 Wisper 有 built-in support 用于事件的异步广播,而 Observer 没有,它们总是同步的。