У меня есть приложение python, которое является чат-сервером. Он имеет несколько комнат, и один клиент может быть подключен к одной комнате. Поэтому у меня есть класс Room и class Client. У клиента есть такие события, как on_open(), on_message() и on_close(), а также функция send(). После получения сообщения мне нужно отправить его другим клиентам в комнату и отправить в мою очередь сообщений. Вот моя проблема. Я не знаю, в каком классе что делать.
Должны ли размещаться в очереди в классе Room или в классе Client?
Где я должен передавать сообщения другим клиентам, в классе «Клиент» или в классе «Комната»?
Или, может быть, я должен пройти ВСЕ события от класса «Клиент» до класса «Класс»?Иерархия классов Python и проблемы с дизайном
ответ
Возможно, вы должны позволить очереди управлять своими собственными проблемами и просто позволить ей слушать события, которые необходимо записать, а не подчинять ее любому из других классов.
Возможно, вы захотите ознакомиться с рисунком наблюдателя (http://code.activestate.com/recipes/131499-observer-pattern/ и http://philipuren.com/serendipity/index.php?/archives/4-guid.html). Он предназначен для ситуаций, когда многие разные классы могут реагировать на изменение состояния (в вашем примере - входящее сообщение). В этом случае ваш класс Client будет «Subject» - он сохранит список классов, которые будут заботиться, когда произойдет что-то вроде on_open(), и сообщите им, что что-то произошло; Наблюдатели (в данном случае, я предлагаю очередь) решают, что делать с этой информацией самостоятельно. Это повышает гибкость в будущем, так как вам не нужно менять существующие классы, если вы хотите добавить новую функциональность, например, создать уведомление о рабочем столе или воспроизвести звук, когда приходит сообщение.
Этот пример, который реализует Observer с декоратор, дает вам представление о том, какую гибкость в будущем вы можете выиграть с помощью этой стратегии: http://reader1000.tumblr.com/post/20361533339/observer-pattern-with-python-decorators
IMHO Очередь должна находиться в помещении, поскольку каждый клиент не отвечает за очередь, но для того, чтобы клиенты могли видеть сообщения, они должны были видеть очередь.
- 1. Python: иерархия классов сериализации
- 2. Иерархия классов и настройка
- 3. Проблемы с дизайном класса
- 4. Иерархия классов
- 5. Amazon DynamoDB и иерархия классов
- 6. Клонируемая иерархия классов и unique_ptr
- 7. Иерархия классов Java
- 8. WooCommerce Проблемы с дизайном
- 9. Проблемы с дизайном DIV
- 10. Проблемы с дизайном MVVM
- 11. Проблемы с дизайном ReactJS
- 12. Проблемы с дизайном GWT
- 13. Проблемы с дизайном хранилища
- 14. проблемы с дизайном barplot
- 15. jQuery.Coundown проблемы с дизайном
- 16. uitableviewcells, проблемы с дизайном
- 17. Иерархия классов для цветов
- 18. Иерархия классов классов с функциями переопределяемого обработчика
- 19. Иерархия нескольких классов Python __init__ не выполняется
- 20. Правильная иерархия классов
- 21. Иерархия классов C++
- 22. Иерархия классов в Ruby
- 23. Иерархия классов шкалы Scala
- 24. проблемы с дизайном с IE
- 25. Иерархия классов в MySQL
- 26. Eclipse, иерархия классов
- 27. Противоречивые иерархия классов
- 28. Иерархия классов метаданных Ruby
- 29. Что такое «Иерархия классов:..
- 30. Иерархия классов в C#
Спасибо за ответ. Однако клиенту не нужно видеть очередь, потому что очередь предназначена для архивирования и выполняется другим процессом. – connexion20000
Без очереди сообщений, как все остальные клиенты будут видеть сообщения? Мое единственное, что было бы подумать: каждый раз, когда приходит сообщение, Комната отправляет сообщение каждому клиенту, но это кажется громоздким. – david
И вот как это делается прямо сейчас. Клиент может принимать события, и он передает сообщение в верхнее помещение. – connexion20000