Finder方法应该是Data Mapper的一部分,还是域类的一部分?

时间:2009-12-30 00:00:12

标签: oop orm datamapper

在Martin Fowler的企业应用程序架构模式一书(第229页,德语,Lazy Load)中,他给出了一个使用此代码的示例:

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

就像你可以看到的那样,finder方法似乎是域类Product的一部分。这让我感到困惑,因为我认为与从某处(通常是数据库,但业务逻辑不应该关心)检索对象相关的一切都应该是Data Mapper(PersonDataMapper)类的一部分。可能我只是错过了什么?

1 个答案:

答案 0 :(得分:3)

您提供的示例是用于延迟加载的简单方法。人不太可能使用DataMapper。正如福勒在英文书中所述(201):

  

使用延迟初始化很简单,   但它确实倾向于强迫依赖   对象和数据库之间。   因此,它最适合    ActiveRecord 表数据网关行数据网关。如果你是   使用 Data Mapper ,你需要一个   额外的间接层,其中   您可以使用虚拟获取   代理 [GOF]。

至于一切[...]应该在DataMapper 中,好吧......是的,但也没有。 使用设计模式时应注意的是何时使用它们以及何时不使用。 DataMapper不是圣杯。这不是唯一的方法。当您的应用只是一个生活在网络上的小而简单的CRUD应用程序时,数据映射器的增加复杂性和/或使用域模型可能不值得付出努力。

此外,设计模式是通用常见软件问题的良好实践方法。虽然您可以将它们应用于书中给出的具体问题,但没有理由虔诚地遵循这些问题。如果模式中的某些内容会使您的问题解决过于复杂,那么保持简单。派生。调整。解决问题。