2009-12-30 36 views
4

在Martin Fowler的模式企業應用架構的書(229頁,在德國,延遲加載),他給出了這個代碼的例子:Finder方法應該是數據映射器的一部分還是域類的一部分?

public List getProducts() { 
    if (products == null) products = Product.findForSupplier(getID()); 
    return products; 
} 

就像你所看到的,取景器的方法似乎是域的一部分一流的產品。這讓我有點困惑,因爲我認爲所有與從檢索對象(通常是數據庫,但業務邏輯不應該關心)有關的所有內容都應該是Data Mapper(PersonDataMapper)類的一部分。大概我錯過了什麼?

+0

既然你是德國人,我還建議購買http://www.phpdesignpatterns.de如果你還沒有擁有它 – Gordon 2009-12-30 11:15:24

回答

3

您給出的示例是簡單方法用於延遲加載。 Person不太可能使用DataMapper。由於福勒在英語書(201)規定:

使用延遲初始化簡單, 但它往往迫使對象和數據庫之間的依賴關係 。 由於這個原因,它最適合於 ActiveRecord,表數據網關行數據網關。如果使用數據映射是 ,則需要一個間接的 附加層,其 可以通過使用一個虛擬 代理 [GOF]獲得。

至於一切[...]應該在DataMapper的,以及..是的,但也沒有。 使用設計模式時應注意什麼是何時使用它們,何時不使用。 DataMapper不是聖盃。這不是唯一的方法。當您的應用只是一個生活在網絡上的小而簡單的CRUD應用時,那麼增加數據映射器和/或使用域模型的複雜性可能是不值得的。

此外,設計模式是通用常見軟件問題的良好實踐方法。雖然你可能會將它們應用於你的書中,但是沒有理由虔誠地遵守它們。如果某種模式中的某些內容會使問題解決過於複雜,那麼可以使它簡單。派生。調整。解決這個問題。

+0

我同意你的觀點,也許DataMapper模式真的是過度發展在我的情況。但是我現在試着爲我的小網站開發一些東西,一旦我有了一個真正大/複雜的東西的想法,這也會很有用。只需將查找器添加到DataMapper中,這聽起來很合理;) – openfrog 2009-12-30 12:10:05

+0

請看,這就是要點。在需要時使用它。如果你不需要它,就離開它。我知道它很誘人,但它不會爲您的應用程序增加任何價值。 – Gordon 2009-12-30 12:15:36

相關問題