2012-01-25 8 views
4

私は、どのように書くべきか、オブジェクトのリストを作成するためにどのデザインパターンを使用するのか、いつも不思議に思ってきました。オブジェクトのリストを作成する適切な方法

まず、CustomerクラスとOrderクラスがあるとします。 ユーザーに属するすべての注文を取得したいと考えています。

$ oCustomer-> getOrders(); Orderオブジェクトの配列を返す。シングルトンで、ストレージエンジンからの注文データを取得し、Orderオブジェクトを構築する能力を持っている

アンOrderManagerクラス、:

基本的に、私はと考えてきました。しかし、私はそれが悪い習慣であることをどこでも読んできたので、それは良いアイデアのようには見えません。

getOrders(args)などのOrderクラスで静的メソッドを使用していますが、それが静的メソッドの実際のポイントであるかどうかはわかりません。インスタンス化Orderオブジェクト内メソッドを使用して(私はそこにいくつかの例が必要な場合があります)

オブジェクトの作成を処理するために(悲しいことに、私が使用したことがない)の工場を使用して

。それは、オブジェクトがそれ自身のコレクションを返すことができるはずがないと思うので、世界で最悪の選択肢のようです。

これは非常に基本的な仕事のように見えますが、それはそうですね。しかし、私は誰かがそれを行うための "適切な"方法を提供することができませんでした。 他のクラスを追加しても問題ありません(DataMappers、Gateways、asoなど...検索とマッピングを処理するため)。しかし、私は本当に私のビジネスロジックでこれらと話をしたくありません。

ありがとうございます。

+0

既存の回答をアップヴォートしたり回答したりしなかったので、あなたはあなたの答えを探しています。ありがとう。 – Gordon

答えて

2

Lazy Load pattern from POEAAを見ている:図は、Customerオブジェクトにデータベースからの注文をフェッチするためのロジックを置くことが示唆されていないことを

Lazy Load pattern from POEAA

注意を。代わりに、このパターンは次のように示唆しています。

遅延読み込みの主な4つの種類があります。 遅延初期化は、フィールドがロードされていないことを示すために特別なマーカー値(通常はnull)を使用します。フィールドへのアクセスのたびに、マーカー値のフィールドがチェックされ、アンロードされた場合はマーカー値がロードされます。 仮想プロキシは、実際のオブジェクトと同じインターフェイスを持つオブジェクトです。メソッドの1つが呼び出されると、実際にオブジェクトをロードしてから委譲します。 値ホルダーは、getValueメソッドを持つオブジェクトです。クライアントはgetValueを呼び出して実際のオブジェクトを取得し、最初の呼び出しで負荷がトリガーされます。 A ゴーストは、データのない実際のオブジェクトです。最初にメソッドを呼び出すと、ゴーストはフルデータをそのフィールドにロードします。

追加のパターンについては、Repositoryと考えて、Data Source Architectural Patternsをご覧ください。一般に、オブジェクト・リレーショナル・ビヘイビアの問題がたくさんある場合は、Doctrine2のようなORMの使用を検討してください。

+1

@ user1159791顧客を作成するときに完全なオブジェクトグラフを取得するか、上記のオプションのいずれかを使用してレイジーローディングを使用してください。 Orders RepositoryをCustomersに挿入することもできます。 – Gordon

0

データベースへの接続を表す1つのクラス、このクラスを使用する1つのデータアクセスオブジェクト、および実際のオブジェクトに1つのクラスを使用できます。

http://en.wikipedia.org/wiki/Data_access_object

+0

こんにちは、 これは、データの取得に役立つかもしれませんが、これはどのように私はオブジェクトのリストを構築することができるか分からない、問題は同じままです。 私がよく理解すれば、DAOは私にデータストレージと私の営業オブジェクトとのマッピングを処理させます。しかし、DAOにオブジェクトリストを作成してもらうことを頼む必要があります。さらに、私は各事業オブジェクトに対して1 DAOを持つことになり、それは急速に乱雑になります。 – user1159791

+0

このデザインパターンでは、DAOの目的は確かにオブジェクトのリストを返すことです。私はモデルからデータ検索を適切に分離するための他の方法は知らない。私はこれを行う他の方法を学ぶことにも興味があります。 –

+0

私は営業ロジックに取り組んでいるときに常に私の営業オブジェクトを使用しなければならない。私は、データアクセス層の抽象化が、アプリケーションのビジネスロジックに完全に理解される必要があります。私が明確であるかどうかはわかりません。 – user1159791

関連する問題