2009-12-30 56 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

相关问题