gpt4 book ai didi

php - 数据映射器模式和收集责任

转载 作者:行者123 更新时间:2023-12-02 01:57:08 25 4
gpt4 key购买 nike

我对集合方面的数据映射器模式有疑问。我一直在关注this article关于存储库、集合和数据映射器模式,我发现它们非常有用,但我需要澄清一些事情:

在这些示例中,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

对比

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

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

最佳答案

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

1) What if you have 10000000 Users and you wish to find all?

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

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

2) Hydrating Objects

您可以拥有一个集合,它会在创建对象时对其进行水化处理。例如;

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

3) Proxy collections / Lazy Loading

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

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

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

关于php - 数据映射器模式和收集责任,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19395735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com