数据映射器模式&收集责任

时间:2013-10-16 05:16:10

标签: php collections datamapper

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

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

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

$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

第一个有点麻烦,但不是更松散耦合吗?

1 个答案:

答案 0 :(得分:1)

收藏品因各种原因而有用,我将概述示例/用途;

  

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

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

如果你有一个集合,你可以迭代整个集合,每次加载一个集合。这要好得多。虽然有时你可能想要一个所有项目的数组,但这不是常态。

  

2)保湿物品

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

如果您有User对象,但用户可以有多个地址,电子邮件地址等。 在创建主用户对象时,集合对象可以是保护/填充从属对象的完整图形的过程的一部分。

  

3)代理收集/延迟加载

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

收藏品还有很多其他用途,但仅凭这些用途就足以在正确的环境中使用。

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