2016-08-17 86 views
1

我們有工廠來創建複雜的對象。 (對於makin的東西)PHP設計模式工廠,倉庫和...?

我們有找到它們的倉庫。 (for findin'stuff)

我們有什麼更新它們? (For changin'stuff up)


看起來像是在拼圖中缺失的一塊?我不認爲它屬於存儲庫,因爲這打破了單一的責任......

+1

是不是「更新」一個對象本身執行的操作嗎?或者,您的意思是「更新」,如「將現有對象的已更改狀態保存回數據存儲區」一樣? – David

+0

您會更新對象,然後將更新的對象傳回存儲庫;無論你的repo是在內存中還是在數據庫中,你仍然要做'$ repo-> save($ object)' – CD001

+1

我們有存儲庫來保存對象(複雜與否) 。持久性包括查找,但也存儲(新的或更新的)對象(以後有東西可以找到)。 – axiac

回答

1

更新實體(以及數據庫)屬於存儲庫。存儲庫本身是數據庫本身和程序之間的一個層。

因此,每個數據庫操作都屬於存儲庫。此外,存儲庫不能與數據庫通信,它也可以具有XML,CSV或API作爲數據源。但這並不重要,因爲您正在與存儲庫進行通信。版本庫處理之後的所有內容。

你可以用另一個更改存儲庫,你的程序可以毫無問題地工作,因爲這些存儲庫都實現了相同的接口。你不再喜歡那個MySQL數據庫,那個老式的CSV好多了?只需更換已使用的Repository即可完成。

查找存儲庫的條目不超過SELECT語句,那麼爲什麼不用UPDATEDELETE呢?

MSDN

進一步閱讀上找到web.archive.org

+0

不同意。如果你採用這種邏輯「每個數據庫操作因此屬於存儲庫」。你不能縮放。 – AndrewMcLagan

+0

爲什麼你不能縮放?每個實體都有自己的存儲庫,因此您可以擴展實體數量,從而擴大您將使用的存儲庫數量。 – KhorneHoly

+0

想一想。抽象數據庫交互不是庫的唯一原因。它們是「取物的對象」......這也是爲什麼工廠模式存在「用於創建複雜事物的對象」。他們都可以從抽象數據庫邏輯中獲益...並非如你所說的唯一原因... – AndrewMcLagan

1

一個很好的解釋和例子,我認爲這取決於方法。

以DDD爲例,您所說的是真實的。版本庫應該負責添加,查找和刪除,因爲它對集合起作用,但是爲什麼它應該能夠更新單個對象呢?

可以做些什麼?我想我只會複製其他人說的話,所以我只會發布鏈接回答:approach to removing save/update from repository

+0

關於' - > save($ object)''的有趣說明'...如果我們打算用書架類比去做,雖然你可以從書架上取出書本,但你可以拿出TipEx做一些修改,然後將它添加回當你完成了書架。 – CD001

+1

它並不真正更新。你說的是從收集中刪除它,然後添加新的基本;-)例如,這個ID呢?它過分複雜的情況。 – mmmm

+0

對象知道它自己的id,但不會改變 - 但是,如果回購是坐在數據庫之上並自動保持集合的狀態,它可能會全部掉下來。 – CD001