Недавно снова вспомнил свой любимый Hibernate и извечный спор что использовать: XML или аннотации. Я в этом споре придерживаюсь старомодной позиции XML и в этой коротенькой статье объясню почему. Изначально весь маппинг писался в XML, но потом в Java 5 пришли на радость людям аннотации и большая часть ORM фреймворков тут же предложили решение для маппинга с их использованием. Вроде бы современный подход, но…
Давайте вспомним такой замечательный принцип как Single Responsibility Principle. Он гласит о том, что код должен иметь минимальное количество ответственностей, в идеале – ровно одну. Тогда он может меняться только по одной причине и это делает его более устойчивым, а значит ваше приложение и база кода будет меньше подвержена изменениям. Что же получается в случае использования аннотаций с ORM? В этом случае на наш POJO ложится сразу две ответственности – отвечать за объект доменной модели и хранить знания о способе хранения информации в БД. Некоторые сюда же добавляют еще одну ответственность – хранение запросов для вычитки данных (при использовании именованных запросов). Не слишком ли много всего для бедного маленького POJO? Да и после манипуляций с аннотациями это уже не такой и POJO. 🙂
Все перечисленные ответственности, собранные в одном месте делают классы доменной модели очень сильно подверженными изменениям, хотя в хорошем приложении должно быть наоборот – доменные объекты меняются крайне редко. В чем же тут дело? Неужели разработчики ORM инструментов толкают нас на нарушение правильных принципов дизайна? Вовсе нет! Кто читал документацию не между строк, заметил, что везде фигурирует понятие Entity. И это не объект доменной модели, а специально заведенный объект для уровня хранения данных, на котором и работает ORM. И тогда Entity имеет только одну ответственность – предоставлять доступ к хранилищу данных.
Но в этом случае вам понадобится отдельный набор доменных объектов и механизм трансформации Entity < -> доменный объект (в простонародье трансформер). И тогда все будет честно, никакие правила хорошего дизайна страдать не будут. Также можно будет избежать добавления дурацких equals и hashCode в доменные объекты, которым это совершенно не нужно. Можно будет делать доменные объекты максимально immutable и не плодить пустых конструкторов и get/set методов для всех свойств. Правда в этом случае придется платить дублированием данных и дополнительной работой над слоем трансформеров. Выбор за вами…
Мы все стремимся сэкономить время и разрабатывать быстро, поэтому многие прикручивают ORM прямо на доменные объекты. И вот в этом классическом случае аннотации являются скорее злом чем добром. А мы должны оставаться на стороне добра! 🙂
P.S. Кто еще не смотрел видео моих выступлений на тему Hibernate, можете найти много для себя интересного. Найти их можно на странице материалов.
Не хочешь пропускать ничего интересного? Подпишись на ленту RSS или следи за нами в Twitter!