3

コレクションに関する Data Mapper パターンについて質問があります。リポジトリ、コレクション、および非常に役立つデータ マッパー パターンに関するこの記事をフォローしてきましたが、何かについて明確にする必要があります。

これらの例では、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

$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 人のユーザーがいて、すべてを検索したい場合はどうしますか?

すべての項目を含む配列を生成すると、その多くのオブジェクトの完全なオブジェクト グラフをロードするメモリがすぐに不足してしまいます。

コレクションがある場合は、一度に 1 つずつロードするセット全体を反復処理できます。これははるかに優れています。すべての項目の配列が必要な場合もありますが、これは標準ではありません。

2) ハイドレーティング オブジェクト

オブジェクトが作成されたときにハイドレートするコレクションを持つことができます。例えば;

ユーザー オブジェクトはあるが、ユーザーは複数のアドレス、電子メール アドレスなどを持つことができます。コレクション オブジェクトは、メインのユーザー オブジェクトが作成されたときに、依存オブジェクトの完全なグラフをハイドレート/移入するプロセスの一部にすることができます。

3) プロキシ コレクション / 遅延読み込み

10000000 個のアルバムを持つことができるアーティスト オブジェクトがあるかもしれません。いくつかのユーザー オブジェクトをロードする場合、各ユーザーのアルバムにもデータを入力するのは非効率的ですが、コレクションをプロキシとして使用して、必要に応じてそれらを遅延ロードすることができます。

コレクションには他にも多くの用途がありますが、これらだけでも、適切な状況で使用する十分な理由があります。

配列は適切で用途があり、コレクションも同様です。適切な場合は両方を使用できます。これは、アプリケーションを設計するときに決定する必要があります。

于 2014-02-04T15:07:06.647 に答える