【问题标题】:Should a Finder Method be part of the Data Mapper, or part of the domain class?Finder 方法应该是数据映射器的一部分,还是域类的一部分?
【发布时间】:2009-12-30 00:00:12
【问题描述】:

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

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

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

【问题讨论】:

标签: oop orm datamapper


【解决方案1】:

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

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

至于 一切 [...] 都应该在 DataMapper 中,嗯.. 是的,但也不是。 使用设计模式时应该记住的是什么时候使用它们,什么时候不使用。 DataMapper 不是圣杯。这不是唯一的方法。如果您的应用只是一个简单的小型 CRUD 应用,存在于 Web 上,那么增加数据映射器和/或使用域模型的复杂性可能不值得。

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

【讨论】:

  • 我同意你的观点,也许 DataMapper 模式在我的情况下真的过度开发了。但是我现在尝试为我的小网站开发一些东西,一旦我对真正大/复杂的东西有了想法,这也会很有用。将查找器添加到 DataMapper,因为这对我来说听起来很合理;)
  • 看,这就是重点。在需要时使用它。如果你不需要它,就把它放在一边。我知道不这样做很诱人,但现在拥有它并不会为您的应用增加任何价值。
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2019-01-17
  • 2022-07-26
相关资源
最近更新 更多