Я также пошел бы с множественные числа , и с вышеупомянутым Пользователи дилемма, мы действительно проявляем квадратный подход заключения в скобки.
Мы делаем это для обеспечения однородности и между архитектурой базы данных и между архитектурой приложения с базовым пониманием, что таблица Users является набором Пользователь значения так же как Пользователи , набор в артефакте кода является набором Пользователь объекты.
Наличие нашей команды данных и наших разработчиков, говорящих на том же концептуальном языке (хотя не всегда те же имена объектов), облегчает передавать идеи между ними.
Просто смотрю на 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 (объект). Но разве это не могло быть примитивным длинным?
Базовая конструкция мне кажется хорошей. Очевидно, чтобы завершить это, вам нужно будет добавить намного больше функций. В текущем дизайне все сообщения хранятся в памяти на неопределенный срок, но в какой-то момент вам понадобится код для очистки старых сообщений.
Несколько важных проблем дизайна, которые я действительно вижу:
Я бы посоветовал изучить фреймворки обмена сообщениями вместо использования шаблона Observer.
Взгляните на эту простую реализацию, которая будет достаточной для вашего игрушечного проекта - eventbus ( больше недоступно). В качестве альтернативы вы можете использовать полномасштабную реализацию JMS, например ActiveMQ .
В основном это позволяет вам определять общую шину, на которой вы можете регистрировать и отменять регистрацию участников, а также отправлять сообщения, которые будут видеть все участники . Большим преимуществом перед шаблоном наблюдателя является очень низкая связь между участниками - вы не регистрируетесь для каждого объекта, чтобы получать его сообщения - вы просто регистрируетесь один раз на шине. Вдобавок вы получаете асинхронную обработку - пусть ' Скажем, у вас 1000 сеансов чата - если вы используете наблюдатель, это означает, что для завершения каждого сообщения потребуется обновить 1000 сеансов. В структуре сообщений отправка сообщений выполняется очень быстро, а уведомление обо всех 1000 сеансах выполняется в фоновом режиме.