2013-03-11 4 views
-1


У меня есть приложение python, которое является чат-сервером. Он имеет несколько комнат, и один клиент может быть подключен к одной комнате. Поэтому у меня есть класс Room и class Client. У клиента есть такие события, как on_open(), on_message() и on_close(), а также функция send(). После получения сообщения мне нужно отправить его другим клиентам в комнату и отправить в мою очередь сообщений. Вот моя проблема. Я не знаю, в каком классе что делать.
Должны ли размещаться в очереди в классе Room или в классе Client?
Где я должен передавать сообщения другим клиентам, в классе «Клиент» или в классе «Комната»?
Или, может быть, я должен пройти ВСЕ события от класса «Клиент» до класса «Класс»?Иерархия классов Python и проблемы с дизайном

ответ

1

Возможно, вы должны позволить очереди управлять своими собственными проблемами и просто позволить ей слушать события, которые необходимо записать, а не подчинять ее любому из других классов.

Возможно, вы захотите ознакомиться с рисунком наблюдателя (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

0

IMHO Очередь должна находиться в помещении, поскольку каждый клиент не отвечает за очередь, но для того, чтобы клиенты могли видеть сообщения, они должны были видеть очередь.

+0

Спасибо за ответ. Однако клиенту не нужно видеть очередь, потому что очередь предназначена для архивирования и выполняется другим процессом. – connexion20000

+0

Без очереди сообщений, как все остальные клиенты будут видеть сообщения? Мое единственное, что было бы подумать: каждый раз, когда приходит сообщение, Комната отправляет сообщение каждому клиенту, но это кажется громоздким. – david

+0

И вот как это делается прямо сейчас. Клиент может принимать события, и он передает сообщение в верхнее помещение. – connexion20000

Смежные вопросы