2011-02-01 15 views
2

データベースから行を取得するすべての検索/取得関数をインスタンスメソッドとしたいのはなぜですか? getByID(id)またはfindPeople(person attributes)関数を持っていれば、オブジェクトを返すか例外をスローします。これらのメソッドの1つを呼び出すたびに、このクラスのインスタンスを作成するオーバーヘッドはどのような理由がありますか?インスタンスメソッドまたは静的メソッドであるデータベースから行を取得するメソッドを検索/取得する必要がありますか?

私はそれがよりテスト可能であると聞いたことがありますが、この場合、なぜインスタンスのメソッドが本当にクラスの他のプロパティと相互作用しないのかわかりません。

+1

私は静的メソッドのアプローチのファンですが、他の方法(Peronsのインスタンスには、最初のインスタンスに関連するPersonインスタンスのコレクションを返すメソッドMySiblingsがあるかもしれません) 。それは一般的なデータアクセスのためにきれいです。しかし、私は他の方法(インスタンスメソッド)を行うための理由を聞いてオープンです。私の経験則では、特定のDAメソッドがアプリケーション全体で使用され、特定のインスタンスのメンバに依存しない場合、DA固有のクラスの静的なメンバにする傾向があります。 – XIVSolutions

答えて

2

問題は、どのように動作させたいのですか...このコンセプトにはいくつかのパターンがあります。

あなたは1を取得したい場合:

あなたは(人々の種類など)、多くの類似したものを持っている場合は、あなたがAbstract Factoryをお勧めします。その場合、静的であることは望ましくありません。しかし、再び、インスタンスを必要とするので、個々のファクトリを抽象ファクトリにバインドできます。そうすれば、 "Person Builder"ファクトリを渡すことになります。次に、あなたが個人を探すときはbuilder.buildPerson(id)と呼ぶでしょう。そのメソッドは個体を検索し、実際にインスタンス化するクラスを決定し、それぞれのファクトリを呼び出します。

「人」の種類が1つだけの場合は、Factory methodを使用します。その場合、クラス(およびその子)がインスタンス化を担当するため、静的メソッドが優先されます。だから、person::getPerson(id)に電話してください。

あなたは多くのを取得したい場合は:あなたは(そのようなfindPeople法と同様に)多くの人々を取得したい場合は

、そして究極のソリューションは、おそらくあなたの必要性に依存するだろう。

オブジェクト作成で何らかの効率が必要な場合は、Flyweightパターンが必要です。

抽象ファクトリを使用している場合は、属性に基づいて複数のインスタンスを見つけるインスタンスメソッドを作成します。ファクトリメソッドを使用している場合は、別の静的メソッドを追加してファクトリメソッドを探します。

しかし、それ

を見てのもう一つの方法は、オブジェクト自体には関係しない「保存」やオブジェクトのデータの「ロード」ということですので、それは静的(メソッドとして属していませんか否か)。その場合、データストアを表すモデルを持つ方が良いでしょう。次に、ユーザーのリストを取得するには、peoplemodel.getPerson(id)を呼び出します。 peoplemodelはDBに対してフェッチし、オブジェクトを構成するために必要な情報をロードします。次に、Personクラスのファクトリを呼び出して実際のオブジェクトを構築し、それを返します。

これは、ストレージが実装から分離されているため、いいです。もちろん、それは別のレイヤーですが、余分なレイヤーを使用すると、複数のデータストアを持つようにすることも、ストレージ要件の異なる複数のアプリケーションに同じ人物クラスを使用することもできます。

だから、結論に:このケースでは、あなたが両側のインスタンスを使用する必要があると思いますので、今

、あなたは、静的メソッドを使用して、別のコンポーネントの疎結合を達成することはできません。だから、あなたはモデルにビルダーを渡して(依存関係注入)、人々オブジェクトを作成します。そして、モデルそのものが疎結合しているので、そのインスタンスを取得し、人を読み込む必要がある場所に渡します。

要するに、それはあなたが何をしようとしているかによって異なります。しかし、最も疎結合したコード(最も再利用可能で最もメンテナンス可能なもの)が必要な場合は、静的メソッドから離れ、抽象ファクトリ/ビルダーとDIに固執してください...

2

一般的にオブジェクト指向設計の観点からは、他の理由は、すでに検索された情報を再利用することである可能性があります。一度オブジェクトのセットを選択してからサブセットを作成すると、DBに移動する必要はなく、より具体的な選択を作成することもできます(複雑な可能性がある最初のクエリを手動で複製する必要はありません)。また、インスタンスを先物またはビルダーとして使用することもできます。そのため、必要に応じてクエリを評価し、その間にインスタンスに持ち込むことができます。

関連する問題