Где поставить такую бизнес-логику? Сервис против DAO?
Дано:
- Spring MVC - Hibernate.
- Контроллер -> Сервис -> DAO
- Теперь у меня есть метод, который извлекает что-то из БД, и ВСЕ, что он делает, должен делать другой метод, скажем, "processList" (что-то вроде простого изменения некоторых значений в списке в зависимости от некоторых параметров экрана).
Вопрос:
- В какой слой я помещаю этот "список процессов"? (Контроллер, Сервис или DAO? И почему)
Сейчас мне действительно нужны некоторые разъяснения j2ee, я знаю, что MVC одинаков для разных языков, но мне просто нужно быть уверенным:) Если бы я делал это в.net, я бы, несомненно, включил это в работу.
1 ответ
Решение
Это действительно зависит от того, что processList
делает точно. Там нет золотого правила. Вот некоторые правила, которым я стараюсь следовать:
- Никогда не совершайте звонки между основными объектами на одном слое.
ManagementServiceImpl
никогда не должен звонитьNotificationServiceImpl
,
- Не делайте круговые зависимости между объектами.
- Это очень похоже на приведенный выше.
- Если вы обнаружите, что повторяете некоторую логику для нескольких основных объектов, попытайтесь реструктурировать код и извлечь его в специализированные логические классы (это также улучшит модульное тестирование).
- Например
UserUpdateHandler
или жеNotificationDispatcher
(они все еще принадлежат сервисному уровню -> никто другой не может их вызывать)...
- Например
- Поместите код туда, где он логически принадлежит.
- Не отвлекайтесь на тот факт, что какой-то класс должен что-то делать. Возможно, это не то место для кода.
- Никогда не пишите полностью обобщенный код, пока вам это не нужно.
- Это называется преждевременным обобщением, что является плохой практикой, аналогичной преждевременной оптимизации. Сохранение нескольких строк кода сейчас может привести к тому, что в будущем вы вырветесь.
- Всегда пишите код, который может стать обобщенным.
- Это не противоречит предыдущему. Это говорит - всегда пишите с учетом обобщения, однако не беспокойтесь о написании, если это не нужно. Думайте заранее, но не обязательно действуйте заранее.
- Оставьте бизнес-логику на уровне обслуживания, логику сохранения данных на уровне данных и логику взаимодействия с пользователем на уровне представления.
- Не пытайтесь анализировать пользовательский ввод в сервисном слое. Это не относится к нему аналогично, поскольку подсчет окончательной цены в приложении интернет-магазина не относится к уровню представления.
Несколько примеров для processList
:
- Пример I - выборка дополнительных отношений через
Hibernate#initialize
- Это то, что действительно находится между сервисом и уровнем DAO. На старых проектах мы специализировались
FetchHandler
класс (принадлежит уровню обслуживания). В новых проектах мы оставляем это полностью DAO.
- Это то, что действительно находится между сервисом и уровнем DAO. На старых проектах мы специализировались
- Пример II - просмотреть список и добавить сообщения о проверке бизнеса в результат
- уровень обслуживания, без сомнения
- Пример III - просмотреть список и подготовить сообщения интерфейса на основе ошибок проверки
- уровень представления
Примечание:
- MVC отличается от трехслойной архитектуры.
- МодельМ охватывает все три слоя. Уровень представления включает в себя как V- виды, так и C- контроллеры.