2012-01-11 62 views
2

我知道核心数据不应该被视为ORM,但它仍然提供类似于ORM的功能。只是好奇,它实施的数据映射模式?我知道“Data Mapper是一个软件层,它将内存中的对象与数据库分开,其责任是在两者之间传输数据,并将它们彼此隔离。” (马丁福勒)。恕我直言上下文管理器处理所有SQL的东西到一个事务,所以这是非常性能明智的设计和恕我直言核心数据可能被视为实施数据映射模式。是实现数据映射器模式的核心数据吗?

回答

1

一年后,我将与我的两分钱

有助于我不是一个ORM专家,最近刚刚开始使用数据映射的东西,但很长一段时间核心数据的用户,我可以说,没有。这种模式的主要目标是从所有与数据库相关的操作中清除一个域对象。

一旦我开始编写单元测试,我注意到的第一件事是我必须加载一个数据库,即使它只是一些内存存储,但我确实必须加载一个。也没有每个类的映射器,我无法控制每个关系是如何存储的。

核心数据加载了大量关于您的对象图的元信息,并强制给他们一些结构。虽然您可以更改持久性存储并烘烤自己的东西,但对于如何做到这一点,您会有很多限制,并且具有明确的“关系”感。

这个想法很好,我们可以说这是它的一些变化。我喜欢的东西是保存操作是由上下文完成的,而不是对象本身。所以有一些类型的分离。

但是看看那些像“awakeFromFetch”或“didSave”这样的函数,这两个操作都与数据存储相关,而不是纯粹的域对象。一个适当的数据映射器模式将允许您为每个持久性存储定义这些操作,而不是统一在一个对象中。

UPDATE:

足够滑稽我的回答后,有一天我不得不处理一个旧的基于CoreData的项目,必须回过头来改善这个答案。要说清楚,我认为“看起来像一个模式”是不够的。例如,外观和适配器模式的实现非常相似,但根据使用方式的不同,您对它们进行了不同的命名。

是核心数据实现数据映射器吗?

我必须说我的“不太”应该是“绝对不是!”

我刚刚非常生气,因为我需要重新命名一些字段,然后添加新的字段。尽管我很清楚自动迁移如何与Core Data协同工作,但我忘记了这些是多么令人讨厌。

你需要多少次新的领域,重新命名的东西,试验,直到你得到它的权利....每一个微小的变化都需要一个完整的数据库迁移?对于数据映射器,这绝不会发生,因为域对象是完全分离的。完成某项新功能后,您只需触摸数据库即可赶上域对象。核心数据迫使您在每个时刻绑定域对象的每个细节。

男孩,直到我忘记核心数据的“微小”烦恼与您使用数据映射器可以实现的完全相反之前,生活有多甜美。

+0

收听[Ruby Rogues podcast的最新插曲](http://instaca.st/b/bfe),关于[Ruby Object Mapper](https://github.com/rom-rb/rom) ,我发现自己也在问同样的问题。你说得对,核心数据没有实现数据映射器,但我认为'NSManagedObjectContext'肯定实现了[Unit Of Work](http://martinfowler.com/eaaCatalog/unitOfWork.html)。 – 2013-09-22 06:30:22