Рельсы-наблюдатели против драгоценного камня Wisper
Есть ли преимущества использования wisper
драгоценный камень над rails-observers
?
На первый взгляд, они оба выглядят довольно схожими, но, похоже, wisper больше поддерживается сообществом (на основе звезд GH, коммитов и релизов). Есть ли существенные различия между ними?
1 ответ
Наблюдатели Rails испытывают те же проблемы, что и обратные вызовы ActiveRecord, в первую очередь из-за того, что их нельзя отключить. С обратными вызовами ActiveRecord вы навсегда соединяете модель с тем, на что ссылается обратный вызов, и любой побочный эффект, возникающий при обратном вызове, всегда происходит при любых обстоятельствах. Использование наблюдателей только действительно решает проблему.
Что если мы хотим использовать нашу модель в контексте, который мы не предвидим сегодня, в котором мы не хотим, чтобы произошел обратный вызов наблюдателя?
Если вы ищете в Stackru "Обратные вызовы Rails", большое количество результатов относится к поиску средств, позволяющих избежать повторного вызова в определенных контекстах. Похоже, разработчики Rails обнаруживают необходимость избегать обратных вызовов, как только они обнаруживают свое существование.
ссылка: http://samuelmullen.com/2013/05/the-problem-with-rails-callbacks/
Wisper (здесь отказ от ответственности, автор) позволяет издателям (например, модели) транслировать события, когда происходит что-то значительное. Слушатели подписываются на издателей во время выполнения. Издатели и подписчики ничего не знают друг о друге. Вместо сильной зависимости друг от друга, они зависят только от события.
Наши системы, по необходимости, имеют зависимости между объектами, им нужно общаться. Однако мы хотим, чтобы эта зависимость была как можно более легкой, чтобы в будущем можно было использовать объект в различных контекстах, которые мы в настоящее время не можем предвидеть сегодня. Также см. Connascence для примеров легких / жестких зависимостей.
Используя Wisper, в разных контекстах вы можете подписаться на слушателя или нет.
Например, в контроллере я мог бы подписать некоторых слушателей, но в моем модульном тесте я мог бы захотеть проверить изоляцию модели без возникновения побочных эффектов. Другим примером может быть задача rake, где я хочу сохранить модель, но не хочу, чтобы возникали определенные побочные эффекты. Или контроллер администратора, где я делаю / не хочу то, что не должно / не должно происходить в других контекстах.
Наконец, Wisper имеет встроенную поддержку асинхронного вещания событий, чего нет у наблюдателей, они всегда синхронны.