24.05.2009 12:05

  1. Интересно, где правильней держать сигнал-хендлеры, в аппликации отправляющей сигналы или в аппликации ловящей их?
  2. Это примерно как "где лучше держать функции: в том же файле, из которого они вызываются, или в другом".

    То есть, такого правила не может существовать в принципе. Это зависит от сути и назначения сигнала: они могут быть предназначены как для внешних, так и для внутренних потребителей. Хотя сигналы, предназначенные для своего же приложения — редкость. Обычно проще вызывать все, что нужно, напрямую. Но теоретически и так может быть.

  3. Ну что бы быть конкретней дам такой пример. Есть новости, у них есть комментарии. Денормализирую данные, записываю в модель новостей счётчик сколько у новости комментариев и записываю в юзера сколько он комментариев оставил во всех новостях.

    Получается что отсылаю сигнал от комментариев которые находятся в одной аппе с новостями и заодно ловлю его в аппе новостей. Теперь ловлю тот же сигнал в аппе профиля для того что бы у юзера счётчик изменить.. Не лучше ли ловить этот сигнал один раз и влиять на две модели сразу? Хотя в таком случае конечно можно save() метод переопределить у модели и из него менять всё что надо. Наверное сигналы придумали как раз чтоб такое не делать..

  4. Начну издалека :-). Сигналы — это способ для одного субъекта системы вызывать какие-то действия (функции) других субъектов, ничего о них при этом не зная. Это позволяет писать независимые приложения, которые на этапе своего написания не завязаны ("не знают") на любые другие.

    В данном случае, если бы приложение новостей вызывало бы напрямую функцию приложения профилей, это означало бы, что новости обязаны где-то у себя иметь что-то вроде from profiles import update_comment_count, и это бы означало, что приложение новостей уже не может существовать без профилей (например, его одного нельзя было бы поместить в другой проект). Сигналы как раз позволяют этого избежать.

    Получается что отсылаю сигнал от комментариев которые находятся в одной аппе с новостями и заодно ловлю его в аппе новостей.

    Если новости и комментарии нераздельны и лежат в одном приложение, то в принципе можно обойтись и без сигнала: просто звать какой-нибудь article.update_comment_count() напрямую. Однако есть другое соображение: раз все равно уже есть сигнал для внешних пользователей, то почему бы его и не использовать? Просто для однообразия. Вполне правомерный случай.

    Не лучше ли ловить этот сигнал один раз и влиять на две модели сразу?

    Если имеется в виду, что обработчик сигнала будет сидеть в приложении новостей, то это будет плохо ровно по тому, с чего я начал: новостям придется быть жестко связанными ("знать") со всеми приложения, которые в этом обработчике вызываются. Это плохой вариант.

    Если имеется в виду, что обработчик сигнала будет лежать в каком-то отдельном от обоих приложений месте (где-то на уровне проекта), то это уже имеет смысл, потому что позволяет разделить приложения профилей и новостей полностью:

    • Новости не будут знать, что они вызывают именно профили.
    • Профили не будут знать, что им нужно ловить сигнал именно от новостей.

    Это хорошая слабая связанность.

    Есть еще тоже вполне правомерный вариант, когда новости про профили ничего не знают, а профили про новости знают: когда в коде профилей ловится сигнал от новостей. Правомерный в том случае, если приложение профилей задумывается именно как дополнение (aka плагин) для этих конкретных новостей.

  5. ruguevara

    0 ↑
    0 ↓
    Я так понял, что профили и так уже не могут жить без комментариев, так как в профилях кэшируется их число.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.