Если под словом «странно» вы имеете в виду, что объекты/классы сущностей вашего домена приложения начинают накапливать много разных, но отдельных (отображающих) аннотаций (некоторые даже семантически одинаковы, например, o.s.data.annotation.Id
SD Common и @javax.persistence.Id
JPA) для разных хранилищ данных, в которых эти сущности будет сохраняться, то я полагаю, что это понятно.
Загрязнение аннотаций только увеличивается по мере увеличения количества представлений для ваших сущностей. Например, подумайте об аннотациях Джексона для сопоставления JSON или JAXB для XML и т. д. Довольно скоро у вас будет больше метаданных, чем фактических данных, :-)
Впрочем, это больше вопрос предпочтений, удобства, простоты, на самом деле.
Некоторые разработчики являются пуристами и любят все экстернализировать. Другим нравится хранить информацию (метаданные) рядом с кодом, использующим ее. Появились даже определенные шаблоны для решения подобных проблем... DTO, ограниченные контексты (см. Fowler BoundedContext, тесно связанный с DDD и микросервисами).
Лично я использую следующие правила при разработке и применении архитектурных принципов/решений в своем коде, особенно при введении чего-то нового:
- Простота
- Последовательность
- СУХОЙ
- Контрольная работа
- Рефакторинг
(наряду с некоторыми другими... хороший OOD, SoC, SOLID, шаблоны проектирования и т. д.).
В том же порядке. Если что-то становится слишком сложным, проведите рефакторинг и упростите его. Будьте последовательны в том, что вы делаете, следуя/используя шаблоны, соглашения; Знакомство — это 1 ключ к последовательности. Но и не повторяйтесь.
В конце концов, речь идет о поддержке приложения. Сможет ли кто-то еще, кто продолжит с того места, где вы остановились, быстро понять организацию и логику и сохранить их... простота превыше всего. Это не означает, что он настолько прост, что нежизнеспособен или ценен. Даже сложные вещи могут быть простыми, если их правильно организовать. Однако разбивка вещей на части и введение абстракций могут иметь скрытые издержки (см. заключительные мысли).
Чтобы более конкретно ответить (несколько) на ваши вопросы...
Я не уверен насчет MongoDB, но (Spring Data) GemFire не имеет внешнего сопоставления. Требуются как минимум @Region
(в классе сущностей) и @Id
, а также @PersistenceConstructor
, если ваш класс сущностей имеет более 1 конструктора. Для пример.
Это похоже на DTO. Лично я считаю, что BoundContexts — это лучшая и более естественная модель данных приложения, поскольку модель предметной области не должна быть чрезмерно привязана к какому-либо постоянному хранилищу или внешнему представлению (например, JSON, XML и т. д.). Модель предметной области приложения является 1 истинным состоянием приложения, и она должна моделировать концепцию, которая представлена естественным образом, а не поверхностно, чтобы удовлетворить какое-либо представление или постоянное хранилище (отсюда отображение/преобразование).
В любом случае, постарайтесь не корить себя слишком сильно. Все дело в управлении сложностью. Попробуйте позволить себе просто делать и использовать тестирование и другие циклы обратной связи, чтобы найти ответ, который подходит для вашего приложения. Вы узнаете.
Надеюсь это поможет.
person
John Blum
schedule
25.05.2016