-
Интересно, где правильней держать сигнал-хендлеры, в аппликации отправляющей сигналы или в аппликации ловящей их?
-
Это примерно как "где лучше держать функции: в том же файле, из которого они вызываются, или в другом".
То есть, такого правила не может существовать в принципе. Это зависит от сути и назначения сигнала: они могут быть предназначены как для внешних, так и для внутренних потребителей. Хотя сигналы, предназначенные для своего же приложения — редкость. Обычно проще вызывать все, что нужно, напрямую. Но теоретически и так может быть.
-
Ну что бы быть конкретней дам такой пример. Есть новости, у них есть комментарии. Денормализирую данные, записываю в модель новостей счётчик сколько у новости комментариев и записываю в юзера сколько он комментариев оставил во всех новостях.
Получается что отсылаю сигнал от комментариев которые находятся в одной аппе с новостями и заодно ловлю его в аппе новостей. Теперь ловлю тот же сигнал в аппе профиля для того что бы у юзера счётчик изменить.. Не лучше ли ловить этот сигнал один раз и влиять на две модели сразу? Хотя в таком случае конечно можно save() метод переопределить у модели и из него менять всё что надо. Наверное сигналы придумали как раз чтоб такое не делать.. -
Начну издалека :-). Сигналы — это способ для одного субъекта системы вызывать какие-то действия (функции) других субъектов, ничего о них при этом не зная. Это позволяет писать независимые приложения, которые на этапе своего написания не завязаны ("не знают") на любые другие.
В данном случае, если бы приложение новостей вызывало бы напрямую функцию приложения профилей, это означало бы, что новости обязаны где-то у себя иметь что-то вроде
from profiles import update_comment_count, и это бы означало, что приложение новостей уже не может существовать без профилей (например, его одного нельзя было бы поместить в другой проект). Сигналы как раз позволяют этого избежать.Получается что отсылаю сигнал от комментариев которые находятся в одной аппе с новостями и заодно ловлю его в аппе новостей.
Если новости и комментарии нераздельны и лежат в одном приложение, то в принципе можно обойтись и без сигнала: просто звать какой-нибудь
article.update_comment_count()напрямую. Однако есть другое соображение: раз все равно уже есть сигнал для внешних пользователей, то почему бы его и не использовать? Просто для однообразия. Вполне правомерный случай.Не лучше ли ловить этот сигнал один раз и влиять на две модели сразу?
Если имеется в виду, что обработчик сигнала будет сидеть в приложении новостей, то это будет плохо ровно по тому, с чего я начал: новостям придется быть жестко связанными ("знать") со всеми приложения, которые в этом обработчике вызываются. Это плохой вариант.
Если имеется в виду, что обработчик сигнала будет лежать в каком-то отдельном от обоих приложений месте (где-то на уровне проекта), то это уже имеет смысл, потому что позволяет разделить приложения профилей и новостей полностью:
- Новости не будут знать, что они вызывают именно профили.
- Профили не будут знать, что им нужно ловить сигнал именно от новостей.
Это хорошая слабая связанность.
Есть еще тоже вполне правомерный вариант, когда новости про профили ничего не знают, а профили про новости знают: когда в коде профилей ловится сигнал от новостей. Правомерный в том случае, если приложение профилей задумывается именно как дополнение (aka плагин) для этих конкретных новостей.
-
Я так понял, что профили и так уже не могут жить без комментариев, так как в профилях кэшируется их число.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


