Ищу совет: обзор / подробное представление моделей

#java #architecture #modeling #3-tier

#java #архитектура #моделирование #3-уровневый

Вопрос:

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

Ситуация

3-уровневая архитектура (богатый клиент, такой как Swing или Eclipse RCP или Android, веб-приложение с реализациями сервисного уровня, реляционная база данных). Мои модели — это POJOs (обычные старые объекты Java, чистые контейнеры данных с приемниками и установщиками), которые сохраняются (технический идентификатор на всех моих моделях).

Я часто имею дело с большими моделями, которые используются в совокупности, но их необходимо эффективно считывать и переносить. Допустим, у меня есть следующие модели:

  • Пользователь, с именем входа, хэшем пароля, солью, именем / фамилией, адресом электронной почты, учетными данными для авторизации, изображением профиля
  • Изображение с именем, типом содержимого и (обычно большими) данными
  • Статья с текстом и автором (пользователем)

Проблема

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

Вообще говоря: иногда мне нужны полные сведения о моих моделях (при их создании / редактировании или в очень специфических ситуациях), но когда я использую их совокупно в других моделях, я бы предпочел иметь упрощенную форму (если мне нужны подробности, я мог бы загрузить их отдельным запросом).

Решение

Для каждой модели я мог бы создать два варианта: подробный вариант с полным CRUD (создание, чтение, обновление, удаление) и упрощенный вариант, доступный только для чтения, который можно использовать как суррогат в агрегативных отношениях. Упрощенная версия модели также содержит технический идентификатор подробной версии, поэтому я мог бы получить его по запросу.

  • Для пользователя: упрощенная модель содержит только имя / фамилию и адрес электронной почты.
  • Что касается изображения: упрощенная модель поставляется без данных изображения.
  • Автор статьи является упрощенной версией пользователя, а изображение профиля пользователя является упрощенной версией изображения.

Вопрос

  • Это существующий шаблон?Это в некоторой степени связано с DTO (объектом передачи данных), но это не то же самое. Кто-нибудь видел это раньше?
  • Использовали ли вы что-то подобное раньше? Есть какие-либо рекомендации по именованию, OO-взаимосвязи между двумя представлениями?

Ответ №1:

Я не могу соотнести ваш вариант решения с известным мне шаблоном. Но ваши требования могут быть выполнены путем последующего внедрения очень тонкого API (Web API) поверх вашего сервиса.

В нем есть две части,

  • Чтение: как вы упомянули, вам может потребоваться направить определенный выбор элементов данных потребителю на основе использования / разрешений. Это можно учесть, указав набор фасетов во входящем запросе GET.

    Проверьте здесь пример,https://developer.linkedin.com/documents/people-search-api

  • Запись: Для фрагментов используйте операции ИСПРАВЛЕНИЯ. Это даст вам гибкость при обновлении по полю.

    Посмотрите здесь пример:https://www.mnot.net/blog/2012/09/05/patch

В целом, это дает вам очень гибкий API с очень чистой моделью предметной области в вашем API. И в наши дни это широко принятый подход.

Надеюсь, это поможет.