3

我有一个关于集合的数据映射器模式的问题。我一直在关注这篇关于存储库、集合和数据映射器模式的文章,我发现它非常有用,但我需要澄清一些事情:

在这些示例中,UserMapper 在其构造函数中采用了 UserCollection,这意味着 UserMapper 实际上负责获取从查询中返回的数据,并从该数据中构建一个集合。

这不会稍微违反 SRP 吗?DataMapper 不应该只从查询中返回一个原始数组,而不是构建并返回该数据的集合包装器吗?以代码为例,以下哪个更合适?:

$userCollection = new UserCollection;
$userMapper = new UserMapper;

$userCollection->addUsers( $userMapper->fetchAll() ); // where addUsers() takes an array and does what it needs to

VS

$userMapper = new UserMapper( new UserCollection );
$userCollection = $userMapper->fetchAll() // where fetchAll() queries the DB, then builds and returns a collection

第一个比较麻烦一些,但不是更松耦合吗?

4

1 回答 1

2

集合出于各种原因很有用,我将概述示例/用途;

1)如果您有 10000000 个用户并且希望找到所有用户怎么办?

如果您生成一个包含所有项目的数组,您将很快耗尽内存来加载那么多对象的完整对象图。

如果你有一个集合,你可以遍历整个集合,一次加载一个。这要好得多。尽管有时您可能需要所有项目的数组,但这不是常态。

2) 保湿对象

您可以拥有一个集合,该集合将在创建对象时对其进行水合。例如;

如果您有一个用户对象,但一个用户可以有多个地址、电子邮件地址等。当创建主用户对象时,您的集合对象可以是水合/填充依赖对象的完整图的过程的一部分。

3)代理集合/延迟加载

您可能有一个艺术家对象,它可以有 10000000 个专辑。如果您加载一些 User 对象,那么为每个 User 填充 Albums 也将是低效的,但您可以使用 Collection 作为代理来根据需要延迟加载它们。

集合还有许多其他用途,但仅这些用途就足以在正确的情况下使用。

数组很好并且有它们的用途,集合也是如此。您可以在合适的时候同时使用它们,这是您在设计应用程序时需要做出的决定。

于 2014-02-04T15:07:06.647 回答