Где поставить такую ​​бизнес-логику? Сервис против DAO?

Дано:

  1. Spring MVC - Hibernate.
  2. Контроллер -> Сервис -> DAO
  3. Теперь у меня есть метод, который извлекает что-то из БД, и ВСЕ, что он делает, должен делать другой метод, скажем, "processList" (что-то вроде простого изменения некоторых значений в списке в зависимости от некоторых параметров экрана).

Вопрос:

  1. В какой слой я помещаю этот "список процессов"? (Контроллер, Сервис или DAO? И почему)

Сейчас мне действительно нужны некоторые разъяснения j2ee, я знаю, что MVC одинаков для разных языков, но мне просто нужно быть уверенным:) Если бы я делал это в.net, я бы, несомненно, включил это в работу.

1 ответ

Решение

Это действительно зависит от того, что processList делает точно. Там нет золотого правила. Вот некоторые правила, которым я стараюсь следовать:

  1. Никогда не совершайте звонки между основными объектами на одном слое.
    • ManagementServiceImpl никогда не должен звонить NotificationServiceImpl,
  2. Не делайте круговые зависимости между объектами.
    • Это очень похоже на приведенный выше.
  3. Если вы обнаружите, что повторяете некоторую логику для нескольких основных объектов, попытайтесь реструктурировать код и извлечь его в специализированные логические классы (это также улучшит модульное тестирование).
    • Например UserUpdateHandler или же NotificationDispatcher (они все еще принадлежат сервисному уровню -> никто другой не может их вызывать)...
  4. Поместите код туда, где он логически принадлежит.
    • Не отвлекайтесь на тот факт, что какой-то класс должен что-то делать. Возможно, это не то место для кода.
  5. Никогда не пишите полностью обобщенный код, пока вам это не нужно.
    • Это называется преждевременным обобщением, что является плохой практикой, аналогичной преждевременной оптимизации. Сохранение нескольких строк кода сейчас может привести к тому, что в будущем вы вырветесь.
  6. Всегда пишите код, который может стать обобщенным.
    • Это не противоречит предыдущему. Это говорит - всегда пишите с учетом обобщения, однако не беспокойтесь о написании, если это не нужно. Думайте заранее, но не обязательно действуйте заранее.
  7. Оставьте бизнес-логику на уровне обслуживания, логику сохранения данных на уровне данных и логику взаимодействия с пользователем на уровне представления.
    • Не пытайтесь анализировать пользовательский ввод в сервисном слое. Это не относится к нему аналогично, поскольку подсчет окончательной цены в приложении интернет-магазина не относится к уровню представления.

Несколько примеров для processList:

  • Пример I - выборка дополнительных отношений через Hibernate#initialize
    • Это то, что действительно находится между сервисом и уровнем DAO. На старых проектах мы специализировались FetchHandler класс (принадлежит уровню обслуживания). В новых проектах мы оставляем это полностью DAO.
  • Пример II - просмотреть список и добавить сообщения о проверке бизнеса в результат
    • уровень обслуживания, без сомнения
  • Пример III - просмотреть список и подготовить сообщения интерфейса на основе ошибок проверки
    • уровень представления

Примечание:

  • MVC отличается от трехслойной архитектуры.
  • МодельМ охватывает все три слоя. Уровень представления включает в себя как V- виды, так и C- контроллеры.
Другие вопросы по тегам