4

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

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

如您所见,finder 方法似乎是域类 Product 的一部分。这让我有点困惑,因为我认为与从某个地方(通常是数据库,但业务逻辑不应该关心)检索对象相关的所有内容都应该是 Data Mapper (PersonDataMapper) 类的一部分。可能我只是错过了什么?

4

1 回答 1

3

您给出的示例是延迟加载的简单方法。Person 不太可能使用 DataMapper。正如福勒在英文书 (201) 中所说:

使用延迟初始化很简单,但它确实倾向于强制对象和数据库之间存在依赖关系。出于这个原因,它最适合 ActiveRecordTable Data GatewayRow Data Gateway。如果您使用的是Data Mapper,您将需要一个额外的间接层,您可以通过使用虚拟代理[GOF] 来获得它。

至于所有 [...] 都应该在 DataMapper 中,嗯.. 是的,但也不是。使用设计模式时应该牢记的是什么时候使用它们,什么时候不使用它们。DataMapper 不是圣杯。这不是唯一的方法。当您的应用程序只是生活在网络上的小型简单 CRUD 应用程序时,数据映射器和/或使用域模型的额外复杂性可能不值得付出努力。

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

于 2009-12-30T12:02:28.970 回答