DAO パターンの使用の長所と短所 [終了]
-
20-09-2019 - |
質問
タイトルで述べたように、特に Web アプリケーション内での DAO パターンの使用について、(経験豊富な開発者として) 皆さんがどのように考えているかを知りたいと思っています。どのような利点を感じましたか?また、その使用によってどのような結果が生じましたか?
解決
私が見てきたのDAOでの問題は、彼らは通常、完全なオブジェクトのすべての時間を扱うということです。これは、単純なクエリでは存在しません完全に不要なオーバーヘッドを作成します。ドロップダウンは、データベースの参照データのオフ作成される場合たとえば、DAOのユーザーは、単純に言うかもしれない:「私のy zで注文したこのテーブルのオブジェクトのコレクションを取得します」。次に、そのデータが取得され、マッピングされたオブジェクト内の他のすべて(それがアクティブであるか否かが作成したデータは、それを最後に更新、ユーザ、など)を無視するが、通常は唯一のキー/値の組み合わせのために、ドロップダウンで使用されています。このマッサージは、DAOの呼び出しの近くに発生し、それらが取得されるとオブジェクトは、通常の場合されていない(保存されません、残念ながら、オブジェクトは、しばしば交流に包まれている場合でも:forEachの(JSP)と、ドロップダウンを生成するために繰り返し処理しました)、それはまだ、これらのオブジェクトを保持するためのメモリの一時的な増加はもちろんのこと、不要なデータベースやネットワークのオーバーヘッドを作成します。
それは確かにすることができます -さて、これはDAOは、参照データの地図を取得するように設計することができないと言っているわけではありません。しかし、一般的に、彼らはすべての時間を必要とされるものではない完全なオブジェクトのマッピングに使用しています。保存するときには強さですが、データ取得時に弱点は、IMO、 - 確かに、あなたはそれのすべてを取得する - 。しかし、多くの場合、あなたはそれのすべてを必要としない、それはちょうど、メモリ、帯域幅と時間を浪費
他のヒント
注記:他にも欠点が見つかるかもしれませんが、私の経験からの簡単なリストをここに示します
長所:
- オブジェクトを取得するための一般的な呼び出し。
- 一般的な作成/読み取り/更新/削除フローを設定したら、他の DAO に対しても一般的なレイアウトを繰り返すことができます。
- また、コードの永続化固有の部分をどこに配置できるかも統合されます。ビジネス ロジックをコードの他のコンポーネントから分離します。
短所:
- それはこれまでで最も柔軟なものではありません。
- 一部の子オブジェクトを遅延読み込みしたい場合は、DAO を他のレイヤーと混合するか、遅延オブジェクトを取得するときに予防策を講じる必要があります。
- DAO を手書きすると、コードが退屈で繰り返しが多くなる可能性があります。
DAO 設計パターンを使用する利点
DAO (データ アクセス オブジェクト) 設計パターンは、オブジェクト指向の原理の抽象化とカプセル化の良い例です。永続化ロジックは、アプリケーションが永続化メカニズムの変更に安全に反応できるようにするデータ アクセス層と呼ばれる別個の層で分離されています。たとえば、ファイルベースの永続化メカニズムからデータベースに移行する場合、変更はデータ アクセス層に限定され、サービス層やドメイン オブジェクトには影響しません。データ アクセス オブジェクトまたは DAO パターンは、コア Java、Web アプリケーション、またはエンタープライズ アプリケーションである Java アプリケーションではほぼ標準です。Java アプリケーションで DAO パターンを使用する利点をいくつか次に示します。
DAO 設計パターンでは、アプリケーションの異なる部分間の結合も低く抑えられます。DAO デザイン パターンを使用すると、ビュー レイヤーは DAO レイヤーから完全に独立し、サービス レイヤーのみがそれに依存し、これも DAO インターフェイスを使用して抽象化されます。
DAO 設計パターンを使用すると、モックを作成し、テストを実行するためにデータベースに接続する必要がなくなるため、JUnit テストをより高速に実行できます。データベースとの統合テストではなく、モック オブジェクトを使用したテストを簡単に作成できるため、テストが向上します。何らかの問題が発生した場合、単体テストの実行中にデータベースではなくコードをチェックするだけで済みます。また、データベースの接続性や環境の問題も防ぎます。
DAO パターンはインターフェイスに基づいているため、「実装よりもインターフェイスのためのプログラミング」というオブジェクト指向設計原則も促進され、柔軟で高品質なコードが得られます。
DAOパターンの力は、彼らはあなたが実際のストレージシステムの素敵な抽象化レイヤーを作成することができていることです。これらは、永続層のより多くのオブジェクト指向のビューとドメインと実際のデータアクセス(ストレートJDBC、永続化フレームワーク、ORMあるいはJPA)を実行するコードとの間の明確な分離を提供します。
私は弱さを引用しなければならないとしたら、まあ、私はそれが別の層だと言うだろう...しかし、私は、これは基本的な永続化APIにあなたのコードを結びつけるないに支払う価格だと思います。
DAO パターンを実装に導入することで実際の利点が得られることがわかりました。これは主に、データベース インターフェイスと実装が明確に分離されているためです。次のような利点が確認されました。
- 実際のデータベース アクセス実装の抽象化により、データ アクセス戦略がユーザーのビジネス ロジックから分離されます。これにより、プロジェクトの初期段階で短期 (Spring JDBC テンプレート) 実装戦略を選択し、後日 IBATIS または Hibernate に移行するオプションを選択できるようになりました。(現時点では私たちには選択をする立場にありません。)
- この分離により、データ アクセスの実装全体を単体テストで模擬できるため、テスト容易性が大幅に向上します。(これが最大のメリットかもしれません)
- これを Spring と組み合わせることで、選択したシステムに任意の DB 実装を挿入できます (ただし、これは DAO パターンよりも DI について詳しく説明している可能性があります)。
私たちが遭遇した問題の 1 つは、これは私たちの設計の明確さの欠如が原因である可能性がありますが、データベースから公開されたデータ値オブジェクトを、アーキテクチャ内の後続の抽象化レイヤー間で転送オブジェクトとして再利用する「傾向」です。苦労の末に私たちがとった解決策は、レイヤーごとに値オブジェクトを持たせることでした(つまり、後続のアーキテクチャ層でデータベース値オブジェクトを再利用しないようにします)。
プロ
- DB テーブルの単一定義ポイント - オブジェクト属性マッピング
- 他のストレージタイプへの DAO 実装の透過的な可能性
- すべての DAO が従うインターフェイス パターンを開発する
- DAO 用に多かれ少なかれ標準的な JUnit テスト クラスを開発すると、テスト カバレッジが向上します。
- 詳細を完全に制御
- 過度に汎用的なソリューションによるパフォーマンスの損失はありません
CON
- 最新のフレームワークを使用するよりも「セクシーさ」が少ない
- 開発者は自分で車輪を発明することはできません (PRO になる可能性があります :-))
ほとんどの開発パターンと同様、DAO の使用には慣れるまでに時間がかかります。経験を積むと、コードがより堅牢になり、開発者は物事が機能するように見えるだけでなく、なぜ機能するのかを理解できるようになります。この最後の点が私にとって最大の利点です。
状況によっては、独自の DAO をコーディングする代わりに永続化フレームワークを使用する方が良い場合があることに注意してください。
あなたはどのような選択肢を検討している?
プレゼンテーション層以外の場所に永続化のための責任を配置することは通常は責任と再利用の明確さの引数から、良いだろうことはかなり明白ようです。プレゼンテーション、サービス、永続性:私は本能的に3層のアプローチのために行きます。あまりにも長い間、私はそのようにそれをやっていないことで被った苦痛の証拠をaduceことができないことのために、このようにそれをやってされていたことを告白。私にはそれが「明白な」と思われ、テストを簡素化し、メンテナンスを容易にし、懸念の良好な分離を与える必要があります永続化メカニズムを理解し、単一の層を有するます。
だからそれは、永続化層を行う正確にどのように問題を残します。私のデフォルトの仮定は、JPA(または類似のフレームワーク)を使用することです。私は、DAOの洗練された例として、これを見行います。
だから私は、DAOの2つのコストを参照してください。まず、あなたのプログラムの構造、その設計に投資する必要があります。些細な例では、これはやり過ぎのように感じることがあります。あなたはあなたのためのDAOを実装フレームワークを使用する場合は、2番目の学習曲線があります。ちょうどJDBCコードを書くと比較すると、直接これは、他の投資です。
プロ:抽象的な分離
。
コン:定型コード(コードジェネレータ/テンプレートとORMのための感謝の神)