2012-01-11 85 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