ActiveRecord Is Even Worse Than ORM

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

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

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

Я не согласен. Более того, я считаю, что ActiveRecord еще хуже, чем ORM.

ORM состоит из двух частей: сессии и DTO, также известных как “сущности”. У сущностей нет функциональности; они просто примитивные контейнеры для передачи данных в и из сессии. И в этом проблема - объекты не инкапсулируют, а скорее выставляют данные наружу. Чтобы понять, почему это неправильно и противоречит объектной парадигме, вы можете прочитать здесь, здесь, здесь, здесь и здесь. Теперь давайте просто согласимся, что это очень неправильно и двигаемся дальше.

Какое решение предлагает ActiveRecord? Как оно решает проблему? Оно перемещает движок в родительский класс, от которого наследуются все наши сущности. Вот как мы должны были сохранять нашу сущность в базе данных в сценарии использования ORM (псевдокод):

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

Метод update() определен в родительском классе книги и использует книгу как контейнер данных. При вызове он извлекает данные из контейнера (книги) и обновляет базу данных. В чем разница с ORM? Никакой разницы нет. Книга по-прежнему является контейнером, который ничего не знает о SQL и любых механизмах сохранения данных.

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

Я считаю, что это ввело в заблуждение тех, кто утверждал, что моя концепция объектов, говорящих на SQL, идентична паттерну проектирования ActiveRecord (или репозиторию, который почти идентичен).

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:39

sixnines availability badge   GitHub stars