Возник такой вопрос: Какие обьекты должны быть в приложении? Имею в виду, где должны быть DTO, где BO, а где DAO. Я просто никогда реальных приложений не видел, поэтому не знаю, как лучше строить архитектуру. Сейчас прикинул себе такой вариант, но не знаю, правильно ли это:
Для работы с фронтэндом я использую DTO-классы, у них есть только те поля, которые можно ввести с формы на фронте. Для каждом формы на фронте создается свой DTO-класс. Пример: RegistrationForm(для формы регистрации пользователя), EditProfileForm(для формы редактирования профиля пользователя). В таких классах нет никакой логики, исключительно поля для транспортировки между фронтэндом и бекэндом.
Для работы с базой использую DAO-классы, в них есть только те поля, которые требуют персистентности, то есть, практически все поля, которые могут быть у теоретического пользователя. Эти классы помечены аннотацией Entity и их структура максимально простая, никакой логики, только поля. Так же, эти классы я пытаюсь держать максимально близко к той части приложения, где производится работа с базой, а в бизнес логику я их не пускаю.
Для бизнес логики я использую обычные классы, которые имеют все нужные пользователю поля и могут содержать какое-то поведение.
Проблемы, которые я заметил:
Например, для условного класса пользователя, все 3 класса(DTO, BO и DAO) почти одинаковые, то есть содержат одни и те же поля, за исключением пары полей. В результате, код дублируется и в случае изменения одного из этих трех, придется менять как минимум еще один. Пример: Изменилась форма на фронте и теперь DTO принимает еще одно поле, значит такое же поле нужно добавить и в BO, а если его еще и нужно сохранять в базу, то и DAO придется менять.
Прошу подсказать, как такие вещи решаются в реальных приложениях, какие для этого существуют паттерны и где об этом можно почитать. Если же описанная выше схема приемлема, то прошу указать на минусы или идеи для улучшения.
одно уточнение. DAO - это не класс с данными (из вашего сообщение складывается ощущение, что у вас это так). DAO - это слой работы с данными. Т.е. тот код, который загружает/сохраняет ваши данные в БД. А классы с данными, которые будут иметь во многих случаях те же поля, что и DTO - это Entity.