2012-01-25 5 views
2

DAOは基本的なCRUD操作のためだけに予約されているのですか、それとも複雑な検索ロジックが含まれている可能性がありますか?DAOの適切な使用について

は、2つのエンティティクラス帳と著者とそれらの間の多対多の関係を想像してみてください。この時点では、両方のエンティティの基本的なCRUD操作が同じであるため、単一のDAOで十分である可能性があります。アプリはより複雑になるにつれて

しかし、新しい要件は、例えば、表示されます。 1.著者は、時間 3の期間中に書かれた本を見つける与え著者 2.のための最初の本を見つけます。与えられた著者が 4を書いたことを特定のトピックに関する書籍は、これらすべてが行くべき

など....見つけますか?今、各エンティティごとに別々のDAOクラスを作成し、そこに配置しますか?彼らはDAO層に属していますか? BookDAOに findBooks(著作者) findBooks(出版社の出版社) の両方を、またはAuthorDAOで1、他のPublisherDAO: はどこ以下の方法が行く必要があります。

私はこのジレンマを持っていますか?

それとも私はDAOをの上で、基本的なCRUD OPSにそれらを残して完全に新しい抽象化、を考える必要があります - すべての可能な検索を示しています例えばSearchService、?

+0

私は通常、そのエンティティのDAOで特定のエンティティを返すメソッド(またはエンティティのコレクション)を置きます。あなたが与えた2つの例は両方ともBookDAO IMOに行くでしょう。それ以外の場合は、 'findBooks(Athor author、Publisher publisher)' – soulcheck

答えて

1

どここれらすべては行くべき?今、各エンティティごとに別々のDAOクラスを作成し、そこに配置しますか?彼らはDAO層に属していますか?

間違いなくDAO(層)の仕事と呼び出し。あなたが持っているものは重要ではありません。特定のメソッドは、それが属するDAOに移動する必要があります。

それとも私はDAOをの上で、基本的なCRUD OPSにそれらを残して完全に新しい抽象化、を考える必要があります - すべての可能な検索を示しています例えばSearchService、?ここ

2つのこと。

  1. ここでは、Hibernateまたは一部のORMツールを使用しているようです。したがって、あなたは私が信じる適切な物を持っています。また、マップやリスト、プリミティブの代わりにDAOレイヤーでこれらのオブジェクトを使用することもできます。とにかく、DAO層から逸脱していなくても、ここにDAO層を持つことができます。ビジネスルールは必要に応じて検証します。
  2. あなたはAbstractDAOパターン(検索/同じもののためのGoogle)を意味し、再びHibernateとSpringはそのようなことを提供します。 SpringではSearchServiceの種類のツール(実際にはクラス)も提供しています。
1

これらはすべてどこにありますか?今、各エンティティごとに別々のDAOクラスを作成し、そこに配置しますか?彼らはDAO層に属していますか?

以下を参照してください。

私はこのジレンマがあります。次の方法が行く必要があります:findBooks(著者の作者)findBooks(出版社の出版社)BookDAO中、またはAuthorDAO内の1つの両方の、他のPublisherDAO

それが依存すると私はそれがエンタープライズソフトウェアアーキテクチャの問題ではなく、OODだと考えています。ロジックが複雑になるにつれて、結束を高め、ソフトウェアコンポーネント間の結合を減らし、同じビジネスコンテキストに属すると見なされるこれらのメソッドを使用して、新しいクラス(リファクタリングカタログhttp://martinfowler.com/refactoring/catalog/extractClass.htmlからExtactクラスを抽出する) 、AuthorDAOなどのすべての書籍は、コードを読みやすくするためにように、呼び出して、再利用可能な、検証可能な、maintableのための著者の機能および電子書籍に関するすべてのメソッドのため、...

それとも私は完全に新しい抽象化を考える必要がありますこれはDAOの上にあり、すべての可能な検索をリストするSearchServiceのような基本的なCRUD操作に任せます。

ビジネスロジックを意味する場合、その抽象化は多層モデルに存在し、ビジネスレイヤーと呼ばれます。 ビジネスロジックをビジネスオブジェクトに関連付けることができます。しかし、findXXXメソッドは、永続性とビジネスレイヤーの間にあるDAOに属します。

+0

を作成したがって、このfindBy ...メソッドが非常に具体的で複雑なものであれば、 DAOに入れられるよりむしろ。いくつかの複雑な抽出アルゴリズムを想像してみてください。 DAOはDBへの最小限の呼び出しでデータを取得する方法を知っているので、DAOに入れなければなりませんが、まだ一部の操作はfindBy ..またはgetでDAOに適合しないと思います。もの。私は何をしますか? – preslavrachev

+0

また、ユーザーが何をしているかの点をガーフィニング、つまりどこに導入したいのですが、どこに合わせるのですか?基本的にポイントは、別のDAOによって保存されるべきですが、誰かが特定のアクションのためにどれくらいの量を保存するかを知っている必要があります。この1つは確かにDAOではありません – preslavrachev

1

DAOは、基本的なCRUD操作のために予約されて

号はDAOをロジックにアクセスするすべてのデータを置くこと自由に感じています。

DAL秒でDAO秒を混同しないでください: