1

開発中の PHP アプリでデータ マッパー パターンを使用していますが、質問があります。現在、特定の ID を持つ Site オブジェクトをリクエストすると、マッパーが行を検索し、オブジェクトを作成して返します。ただし、同じサイトに対してこれを再度行うと、同じデータを持つ 2 つの異なるオブジェクトが作成されます。例えば。:

$mapper = new Site_Mapper();
$a = $mapper->get(1);
$b = $mapper->get(1);

$a == $b // true
$a === $b // false

だから、私の質問は、私はすべきですか:

  1. インスタンス化された Site オブジェクトをマッパーに保存して、新しいオブジェクトを作成する前にそれらが既に存在するかどうかを確認できるようにします (同じタイプのマッパーが複数ある場合は問題になる可能性があります)。
  2. #1と同じことを行いますが、各マッパーのインスタンスが1つだけであることを確認してください
  3. #1と同じことを行いますが、複数のインスタンスが問題にならないように静的プロパティを使用します
  4. 多分問題ないから気にしないで
4

3 に答える 3

5

あなたが探しているのはアイデンティティマップパターンです。ただし、いわゆる「読み取りの不整合」には注意してください。「古いインスタンス」を使用しているときに、DBがすでに変更されている可能性があります。また、オブジェクトを編集しているときに、別のユーザーがそのインスタンスを取得し、より速く変更し、より速く保存する可能性があります。次に、他のオブジェクトがこれらすべての変更を再度オーバーライドします。ただし、Webでは、「ページ」がすぐに実行され、数秒より長く存続するオブジェクトがないため、それほど大きな問題ではない可能性があります。

于 2010-01-04T18:15:42.510 に答える
2

質問がかなり前に行われたことは知っていますが、他の誰かが同様のジレンマに陥った場合に備えて、まだ答えたいと思っていました。実際、著者が行った上記の提案 #1、2、3 はすべて関連しており、問題を解決するにはそれらすべてを考慮する必要があります。

1)DBオブジェクトから取得した各オブジェクトをマッパーに保存して、同じIDを持つオブジェクトが要求されたときに再度行う必要がないようにします。その後のすべての呼び出しで、マッパーは格納されたオブジェクトを返す必要があります。これをIdentityMapパターンと呼びます。これを実現するには、マッパーでプライベート プロパティを作成して、特定のオブジェクト タイプの IdentityMap のインスタンスを保持します。Site_Mapper->get() メソッドは、オブジェクトが取得されていない場合、特定の ID の IdentityMap を常にチェックする必要がありますが、マッパーはデータベースにアクセスしますが、既にマップに格納されている場合は、トリップを保存するキャッシュされたインスタンスを返します。データベース。したがって、同じオブジェクト インスタンスへの参照になるため、 $a === $b は true になるはずです。

2) はい、理想的には、特定の時点で IdentityMap の単一のインスタンスを維持するために、特定のデータ マッパー (Site_Mapper) のインスタンスが常に 1 つ存在する必要があります。これは、 Singletonパターンを使用して実行できます。これは、特定のマッパーの同じインスタンスを常に返すSite_Mapper::getInstance()などの getter メソッドで可能です。また、 __construct()をプライベート メソッドとして宣言して、newを使用した不要なインスタンス化を防ぎ、 getInstance()がマッパーをインスタンス化する唯一の方法であることを確認する必要があります。

3) 著者が静的プロパティについて上で言及したことも同様です。PHPでシングルトンを実装するには、静的プロパティを使用してマッパーのインスタンスを保持する必要があります。

上記のパターンやその他多くのパターンについて説明している Martin Fowler の著書「エンタープライズ アプリケーション アーキテクチャのパターン」を強くお勧めします。独自のカスタム ORM ソリューションに取り組んでいる場合は特に、お読みください。それが役立つことを願っています。

于 2010-09-20T05:17:58.680 に答える
1

私はどういうわけかキャッシングを使用します-静的マッパークラスが私の最初の選択肢であり、私がほとんど見たものです。それ以外の場合は、オプション2(シングルトンパターン)がおそらく最良のオプションです。

古いデータが返されないように、更新が行われたときにこのキャッシュをクリアする必要があることを忘れないでください。

そうは言っても、あなたが多くの使用を得るために何かを作っているか、それが多くのクエリを実行しない限り、それは問題ではないかもしれません。(あなたの4)

また、ガイダンスを探す価値があります(多くの例があると確信していますが、これを最もよく知っています)、Propel(http://propel.phpdb.org/)にはキャッシュ機能があります-それがどのように機能するかを見る価値があるかもしれませんそれ?それとも単にそれを使用しますか?

于 2009-01-31T18:15:51.010 に答える