ИМХО - Наблюдатели сосут
Я рассмотрю несколько причин, по которым, я думаю, они это делают. Напомним, что в целом это относится и к использованию методов before_x или after_x, которые являются более частичными примерами общего Observer.
затрудняет написание правильных модульных тестов
Обычно, когда вы пишете модульные тесты, вы тестируете определенную часть функциональности. Однако, чтобы проверить наблюдателя, вам нужно «вызвать» событие, чтобы проверить его, а иногда это просто неудобно.
например. Если вы подключите наблюдателя к before_save, то для запуска кода вам нужно сохранить модель. Это затрудняет тестирование, учитывая, что вы можете тестировать бизнес-логику, а не постоянство. Если вы отключите сохранение, ваш триггер может не сработать. И если вы позволите сохранить, то ваши тесты будут медленными.
Требуется состояние
Исходя из того, что наблюдателей, как правило, трудно проверять, наблюдателям, как правило, также требуется много государства. Причина в том, что логика в наблюдателе пытается различить различные «деловые события», и единственный способ сделать это - посмотреть на состояние объекта. Это требует значительных настроек в ваших тестах и, следовательно, делает тестирование сложным, утомительным и проблематичным.
непреднамеренные последствия
Без сомнения, вы только что испытали это, потому что вы можете подключить несколько наблюдений, вы не представляете, что может вызвать различные виды поведения. Это приводит к непреднамеренным последствиям, которые вы можете обнаружить только при интеграции / тестировании системы (медленная обратная связь). Отслеживать ваших наблюдателей тоже не очень весело.
Проблемы с допущениями заказа
Нет гарантии того, что наблюдатель может сработать. Вам гарантировано, что он будет скинут. Если у вас есть неявный порядок как часть ваших бизнес-правил, то Наблюдатели ошибаются.
Приводит к плохому дизайну
Добавление вещей путем подключения наблюдателей приводит к плохим проектам. Это приводит к тому, что вы подключаете все, чтобы сохранять, удалять, создавать события, что, хотя и удобно, также трудно понять. Например. сохранение пользователя может означать, что вы обновляете данные пользователя, или это может означать, что вы добавляете в него новое имя учетной записи. Знание того, что вы конкретно можете сделать с объектом, является частью причины, по которой у вас есть методы и содержательные имена, основанные на действиях. Если все является наблюдателем, то это теряется, и все теперь реагирует на события, и в рамках вашей логики наблюдения вы стремитесь различить событие, принадлежащее к какому бизнес-событию.
Есть некоторые места, где наблюдатель хорош, но обычно это исключение. Гораздо лучше привить то, что можно сделать явно, чем неявно кодировать логику с помощью обратных вызовов.