0

所以在 OOP 中,对象向其他对象发送消息。这是一个非常简单的概念,只要所有对象都存在于内存中,就很容易实现,例如通过调用方法。

但在现实生活中,我们将对象持久保存到数据库或其他地方,因为没有足够的 RAM 来保存所有对象。如何在当前持久化的对象上调用方法?

好的,所以也许可以将未持久化的一个对象封装到它的工厂中。但是如果我想向很多对象发送消息,例如在一个循环中呢?一个一个地取消它们是一个经典的 N+1 问题。

好的,我可以拥有一个可以一次性取消所有必要对象的存储库。但是要求存储库获取我的对象不会破坏封装吗?

像观察者这样的模式呢?是否有可能让一个对象订阅任何东西,知道它将被持久化?

是否有任何语言的透明实现?

4

1 回答 1

0

我认为不会。RAM 对 OOP 至关重要。一旦你坚持了一些东西,在 RAM 之外,它就不再是 OOP 了。

一个对象实际上是它所接触的所有对象的总和,加上它们所接触的所有对象,再加上……为了工作,一个对象几乎需要与许多其他对象进行即时通信。否则,性能将停滞不前。(想想虚拟内存:如果你曾经在一台 0.5GB 的机器上使用过 1.5GB,你就会知道问题所在。)

基于慢速内存的存储倾向于使用关系存储或大块顺序数据,每个块都通过键随机访问。我编写了大数据、高度交互(以及如此严重的 OO)系统,这些系统将数据保存在 SQL 数据库中。我必须组织数据库,以便可以将其划分为可管理的块,每个块都可以独立存在,其中几个块将被加载到会话中。然后我不得不编写大量代码来将表格、行和列变成有用的对象。要写入数据库,我必须扭转整个过程。

因此,要启动程序,DB 数据进入搅拌机,结果完全不同。当用户完成并保存到数据库时,数据被取消混合并放回。内存中的对象与数据库表没有明显的关系(尽管显然可以通过足够的工作从另一个创建一个)。这与我能够达到的可用持久性一样接近。原子单位比对象或行大得多,每次转换都需要一段时间(整秒)。

我在 ORM 上做了一点(非常)工作。这里的诀窍是 OO 用于模仿关系存储。如果你从一个好的 OO 设计开始,你最终不会得到你会得到的对象,而是得到一个看起来就像一个关系数据库的东西。在很多情况下,这正是您想要的,而且效果很好。但这不是真正的OOP,可能也不是您想要的。

所以我没有找到普遍的答案。快速记忆和面向对象——以及慢速记忆和关系/非现实——是两个不同的东西,弥合这种差距需要仔细研究具体案例和一些天才。

于 2013-07-23T19:54:58.830 回答