Подходящий шаблон разработки для простого приложения чата

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

Мы делаем это для обеспечения однородности и между архитектурой базы данных и между архитектурой приложения с базовым пониманием, что таблица Users является набором Пользователь значения так же как Пользователи , набор в артефакте кода является набором Пользователь объекты.

Наличие нашей команды данных и наших разработчиков, говорящих на том же концептуальном языке (хотя не всегда те же имена объектов), облегчает передавать идеи между ними.

10
задан Priyank 29 July 2009 в 04:16
поделиться

3 ответа

Просто смотрю на User , почему равенство зависит от идентификатора и никнейма? Мне это кажется немного противоречащим интуиции. Я ожидаю, что если у вас есть id, то это будет идентификация объекта и, следовательно, то, что вы бы использовали в условии равенства.

Я также вижу, что у вас есть установщик для идентификатора пользователя. Так вы действительно хотите изменить идентификатор пользователя? Я вижу, что вы можете изменить ник, что имеет смысл. Но я бы ожидал, что идентификатор останется постоянным.

Обратите внимание, что, поскольку вы переопределяете equals (), вы также должны переопределить hashCode () .

Теперь, если hashCode () и equals () полагаются на неизменяемые поля (например, id), то результаты hashCode () не изменятся, а если вы поместите пользователя в хешированную коллекцию (например, HashMap), вы не собираетесь чтобы потерять его позже (что очень сбивает с толку)!

Наконец (!) Я бы защитил конструктор и сеттеры от нулевых псевдонимов (заставил их бросать IllegalArgumentExceptions), а затем коду вроде equals () не нужно было беспокоиться о нулевом псевдоним (если «null» не имеет значения для псевдонима). Я бы сделал то же самое для id, поскольку у вас это как Long (объект). Но разве это не могло быть примитивным длинным?

re не собираюсь потерять его позже (что очень сбивает с толку)!

Наконец (!) я бы защитил конструктор и сеттеры от нулевых никнеймов (заставил их бросать IllegalArgumentExceptions), и тогда код вроде equals () не должен беспокоиться о пустом псевдониме (если только «null» не имеет значения для псевдонима). Я бы сделал то же самое для id, поскольку у вас это как Long (объект). Но разве это не могло быть примитивным длинным?

re не собираюсь потерять его позже (что очень сбивает с толку)!

Наконец (!) я бы защитил конструктор и сеттеры от нулевых никнеймов (заставил их бросать IllegalArgumentExceptions), и тогда код вроде equals () не должен беспокоиться о пустом нике (если только «ноль» не имеет значения для псевдонима). Я бы сделал то же самое для id, поскольку у вас это как Long (объект). Но разве это не могло быть примитивным длинным?

5
ответ дан 3 December 2019 в 23:50
поделиться

Базовая конструкция мне кажется хорошей. Очевидно, чтобы завершить это, вам нужно будет добавить намного больше функций. В текущем дизайне все сообщения хранятся в памяти на неопределенный срок, но в какой-то момент вам понадобится код для очистки старых сообщений.

Несколько важных проблем дизайна, которые я действительно вижу:

  1. Интерфейс сообщений не имеет обратной связи. отправитель сообщения - в большинстве чатов показано, кто что сказал, и это будет сложно без поля «Пользователь» в сообщении.
  2. Интерфейс сообщения не имеет свойства времени. Это затруднит удаление старых сообщений.
6
ответ дан 3 December 2019 в 23:50
поделиться

Я бы посоветовал изучить фреймворки обмена сообщениями вместо использования шаблона Observer.

Взгляните на эту простую реализацию, которая будет достаточной для вашего игрушечного проекта - eventbus ( больше недоступно). В качестве альтернативы вы можете использовать полномасштабную реализацию JMS, например ActiveMQ .

В основном это позволяет вам определять общую шину, на которой вы можете регистрировать и отменять регистрацию участников, а также отправлять сообщения, которые будут видеть все участники . Большим преимуществом перед шаблоном наблюдателя является очень низкая связь между участниками - вы не регистрируетесь для каждого объекта, чтобы получать его сообщения - вы просто регистрируетесь один раз на шине. Вдобавок вы получаете асинхронную обработку - пусть ' Скажем, у вас 1000 сеансов чата - если вы используете наблюдатель, это означает, что для завершения каждого сообщения потребуется обновить 1000 сеансов. В структуре сообщений отправка сообщений выполняется очень быстро, а уведомление обо всех 1000 сеансах выполняется в фоновом режиме.

2
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: