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

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

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы