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(数据传输对象),这些DTO是无功能、被动的,并且根本不是对象。其结果通常是戏剧性的——整个编程范式从面向对象转向面向过程。我今年在JPointJEEConf上试图解释这个问题。每次演讲结束后,有几个人告诉我,我所提出的东西被称为ActiveRecordRepository模式。

此外,他们声称ActiveRecord实际上解决了我在ORM中发现的问题。他们说我应该在演讲中解释,我所提供的东西(能够使用SQL的对象)已经存在并且有一个名字:ActiveRecord。

我不同意。此外,我认为ActiveRecord甚至比ORM更糟糕。

ORM由两部分组成:会话和DTO(也称为“实体”)。这些实体没有功能,它们只是用于从会话传输数据的原始容器。问题就在于此——对象不封装而是暴露数据。要理解为什么这是错误的,以及为什么违背了面向对象的范式,你可以在这里、这里、这里、这里和这里阅读。现在,我们就同意这是非常错误的,继续往下说。

ActiveRecord提出了什么解决方案?它如何解决这个问题?它将引擎移入了“父类”,而我们所有的实体都继承自它。这就是在ORM场景中我们应该如何将实体保存到数据库的方式(伪代码):

这是我们对一个ActiveRecord所做的操作。

方法update()在书的父类中定义,并将书作为数据容器。当调用时,它从容器(书)中获取数据并更新数据库。它与ORM有何不同?根本没有区别。这本书仍然是一个不知道SQL和任何持久化机制的容器。

与ORM相比,ActiveRecord更糟糕的是它隐藏了对象是数据容器的事实。在第二段代码片段中,一本书假装是一个合适的对象,但实际上只是一个愚蠢的数据包。

我相信这就是那些认为我说的SQL对象概念与ActiveRecord设计模式(或几乎完全相同的Repository)完全相同的人所误导的地方。

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

sixnines availability badge   GitHub stars