четверг, 1 июня 2017 г.

ActiveRecord даже хуже, чем ORM

Вероятно, вы помните, что я думаю об ORM, очень популярном паттерне. Если кратко, это побуждает нас превращать объекты в DTO - в результате, вся парадигма программирования переходит от объектно-ориентированного подхода к процедурному. Я попытался объяснить это в JPoint и JEEConf в этом году. После каждого разговора несколько человек сказали мне, что то, что я предлагаю, называется шаблонами ActiveRecord или Repository.

Более того, они утверждали, что ActiveRecord фактически решает проблему, которую я нашел в ORM. Они сказали, что я должен объяснить, что то, что я предлагаю (объекты, говорящие на SQL-языке), уже существует и имя им: ActiveRecord.

объектный экземпляр связан к единственной строке в таблице. После создания объекта новая строка  будет добавляться к таблице на сохранение. Любой загруженный объект получает свою информацию от базы данных. Когда объект обновлен, соответствующая строка в таблице также  будет обновлена. Класс обертки реализует методы средства доступа или свойства для каждого столбца в таблице или представлении.
Я не согласен. Более того, я считаю, что ActiveRecord даже хуже ORM.

ORM состоит из двух частей: сеанса и DTO, также называемых «сущностями». У объектов нет функциональности; Они являются просто примитивными контейнерами для данных, переданных с и на сеанс. И вот в чем проблема: объекты не инкапсулируют, а скорее предоставляют данные.

Какое решение предлагает ActiveRecord? Как это решит проблемы? Он перемещает движок в родительский класс, от которого наследуются все наши сущности. Таким образом, мы должны были сохранить наш объект в базе данных в сценарии ORM (псевдокод):
Book.setTitle («Java в двух словах»);
Session.update (книга);

И это то, что мы делаем с ActiveRecord:

Book.setTitle («Java в двух словах»);
book.update ();
Метод update () определяется в родительском классе книги и использует книгу в качестве контейнера данных. При вызове он извлекает данные из контейнера (книги) и обновляет базу данных. Чем это отличается от ORM? Нет никакой разницы. Книга по-прежнему является контейнером, который ничего не знает о SQL и каких-либо механизмах сохранения.
Что еще хуже в ActiveRecord, по сравнению с ORM, заключается в том, что паттерн скрывает тот факт, что объекты в нем являются всего лишь контейнерами данных. Книга во втором фрагменте делает вид, что является подходящим объектом, в то время как на самом деле это просто немой пакет данных.
Я считаю, что это то, что вводило в заблуждение тех, кто говорил, что моя концепция SQL-говорящих объектов точно такая же, как шаблон проектирования ActiveRecord (или Repository, который почти точно такой же).

2 комментария: