Задать вопрос

Как разработать грамотную архитектуру приложения: работа с базой данных?

Как правильно спроектировать в приложении слой, отвечающий за работу с базой данных?

Почему подход, когда все операции чтения/записи производит отдельный класс DbManager, плох?
4090a77f001b3f482f0d57e5fb60e3.png

Как сделать правильно? Соответствующие классы UserService, ArticleService и т.д., которые будут за это отвечать? Но тогда ведь всё равно нужен класс, который будет привязан к конкретной реализации (например, работающий с БД MySQL через JDBC-драйвер), разве нет?
a2e6782c411b6144e046cff2d22ad4.png

Какие есть плюсы и минусы в обоих решениях? Может быть, нужно делать вообще как-то иначе?

Раньше подход с первой диаграммы казался мне правильным и логичным, но в последнее время натыкаюсь на упоминания того, что так делать не следует (буквально сегодня, например, здесь).
  • Вопрос задан
  • 5570 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Первый подход плох тем, что в нем вы создаете God-object, он берет на себя слишком много ответственности, что противоречит принципу SRP. Класс будет иметь большой размер и в него постоянно будут вноситься изменения при изменении функциональности.

Второй подход почти правильный. Не хватает только интерфейсов UserServiceInterface и ArticleServiceInterface, в которых описаны методы доступа к данным. Обычно такие интерфейсы называются Repository, а не Service. Эти интерфейсы должны быть реализованы в конкретных классах, например OracleUserService и OracleArticleService. Для взаимодействия с БД, данные классы используют только сессию (Session) или соединение (Connection). В вашем примере это DbHandler.

Почитайте про устройство Hibernate. Он использует второй подход.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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