2011-11-18 21 views
0

我正在使用Zend Framework,並嘗試使用DDD方法(Domain-Driven Design)。我有模型,映射器和域對象的DbTables。在領域驅動設計中檢索對象集合的方法

當我需要獲取同一時間的多個實體時(例如系統中所有用戶的列表),有很多情況,所以我的用戶模型將有一個方法'getAllUsers',它將返回所有用戶現在它返回一個所有用戶的數組,但我正在考慮創建一個集合類)。到目前爲止,我正在使用普通方法(非靜態)來獲取集合,爲此,我需要創建一個「空」對象。另一種選擇是將其轉換爲靜態方法。

我不確定,哪種方法更好,請保留非靜態方法或將它們轉換爲靜態方法。什麼是更好的方法/實踐,爲什麼?還有哪種方法嚴格遵循DDD方法。 PS:請讓我知道,如果你能想到更好的標題。不,它不是一個課程問題。

回答

0

靜態方法意味着不需要實例化對象來調用它。通常使用靜態方法將與整個類相關的方法分組,而不僅僅是類的特定實例。相反 - 非靜態方法用於將與特定單個對象相關的方法分組。因此,如果您將getAllUsers()標記爲非靜態並將其放在用戶下面,基本上您要求一個特定用戶瞭解其他每個用戶。使用比喻 - 就像從一個公民那裏詢問關於全部公民的全部信息(你知道他們都在你的國家嗎?)。

將它標記爲靜態就好像要求有關citizen definition in encyclopedia的所有公民的信息。它比標記它非靜態更好,但仍然有點奇怪和尷尬。

通常國家都有人口登記冊,負責處理有關公民的信息。將比喻轉換回來 - 你會得到「別的東西」,負責這個的類似收藏的寄存器。

+0

謝謝,所以我應該創建一個類'UserCollection'並使用它來檢索多個用戶 – Bryan

+0

@Bryan您可能想要查看所謂的Repository模式 –

1

首先,我認爲這不是DDD相關的問題。使用或不使用靜態方法更像是OOP或設計問題。

基本上使用類靜態方法不是真正的OOP,而是過程編程,因爲你不能使用任何OOP範例,如封裝或繼承。它指出了可能的設計缺陷/代碼味道。

它也使得單元測試變得困難,因爲mocking of static方法更加複雜,並且AFAIK已被添加以允許通過單元測試覆蓋遺留代碼。

如果發佈一些代碼示例,回答您的問題會更容易。

回答了類似的問題hereherehere

0

在域驅動設計中,持久性用戶集合應表示爲UserRepository接口。該接口的具體實現有一個狀態,包括例如數據庫連接的狀態。因此,你需要一個存儲庫實現的實例,其方法將是實例方法而不是靜態方法。