核心数据是否实现了数据映射器模式?

时间:2012-01-11 09:38:32

标签: iphone objective-c cocoa-touch design-patterns datamapper

我知道核心数据不应被视为ORM,但它仍然提供与ORM类似的功能。只是好奇,它是否实现了数据映射器模式?我知道“数据映射器是一个将内存中对象与数据库分开的软件层。它的职责是在两者之间传输数据,并将它们相互隔离。” (马丁福勒) IMHO上下文管理器将所有SQL内容处理成一个事务,因此它是非常性能的设计,并且IMHO核心数据可能被认为是实现数据映射器模式。

1 个答案:

答案 0 :(得分:1)

一年后,我将用我的两美分捐款

我不是ORM专家,最近才开始使用Data Mapper,但作为Core Data用户,我可以说没有。此模式的主要目标是从所有与数据库相关的操作中明确切割域对象。

一旦我开始编写单元测试,我首先要注意的是我必须加载一个数据库,即使它只是内存中的一些,但我必须加载一个。此外,每个类都没有映射器,我无法控制每个关系的存储方式。

核心数据会加载大量有关对象图的元信息,并强制使用某些结构。虽然你可以改变持久存储并烘焙自己的东西,但是你会对它有很多限制,并且有一种清晰的“关系”感觉。

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

然而,看看像“awakeFromFetch”或“didSave”这样的函数,这两个操作都与数据存储相关,而不是普通的域对象。正确的Data Mapper模式允许您为每个持久性存储定义这些操作,而不是统一在单个对象中。

<强>更新

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

核心数据是否实施了数据映射器?

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

我非常生气,因为我需要重命名一些字段,然后再添加新字段。虽然我很清楚自动迁移如何与Core Data一起使用,但我忘了这些是多么烦人。

你需要多少次新的领域,重命名一些东西,进行实验直到你做对了......每一个微小的变化都需要一个完整的数据库迁移?使用Data Mappers时,这种情况永远不会发生,因为域对象完全解耦。完成一些新功能后,您只需触摸数据库即可赶上域对象。 Core Data强制您在域对象的每个细节的每个时刻绑定。

男孩,生活多么甜蜜,直到我忘记了Core Data的“微小”烦恼与数据映射器所能达到的完全相反。