1

バイナリ ファイルと RDBMS の両方にクラス インスタンス データを読み書きするための機能またはフレームワーク (つまり、インターフェイス クラスなど) を提供する C++ ドメイン モデル クラス ライブラリを開発しています。このライブラリの基礎は、RDBMS を使用するアプリケーションです。データベースの取得と更新の一連の呼び出しを実行してメンバー データのコレクションを取得することにより、クラスをインスタンス化するメソッドがいくつかあります。シリアル化されたデータ アクセスでは、データを整理する方法が異なるため、ドメイン モデルがプライマリ/外部キー、ID などを完全に認識しないようにする必要があります。

この問題を解決するために、私はデータ アクセス オブジェクト(DAO) パターンの使用を検討しており、DAO オブジェクトの「粒度」、有効期間、および使用についてアドバイスをお願いしたいと思います (返信では、C++ を使用することに注意してください)。であり、ドメイン クラスは RDBMS またはバイナリ ファイル ストアからの ID/キー情報を保持できない):

  1. ドメイン オブジェクトの各 Foo インスタンスには独自の FooDAO インスタンスがありますか、それともクラス Foo のすべてのインスタンスに対して単一の FooDAO インスタンスがありますか?
  2. FooDAO は Foo インスタンスごとに 1 回作成されますか?それとも、FooDAO インスタンスはデータへのアクセスが必要な場合にのみ作成され、その後すぐに破棄されますか?
  3. DAOのJ2EEページでは、DAO に加えて DTO を紹介しています。DAO がデータを転送できないのはなぜですか?
  4. 他のドメイン クラス Bar のインスタンスを持つ複雑なドメイン クラス Foo の場合、FooDAO クラスが BarDAO クラスを使用してデータを取得することは避けられないようです。これは、ドメイン クラス構造と DAO クラス構造に並列の階層/依存関係をもたらします。これをどのように管理するのが最善でしょうか?

ご協力いただきありがとうございます!

4

2 に答える 2

1

あなたにとって良い解決策はありませんが、私が持っているものと、いくつかの考えや経験をお話しすることができます. 以前に使用されたモデルに基づいて、非常によく似たものを C++ ライブラリとして作成しました。

いくつかの考え、順不同:

  • DB 内のインスタンスごとに、DAO オブジェクトの個別のインスタンスを用意します。共有インスタンスがある場合、スレッドの同期が問題になる可能性があり、大量のコピーを行う必要があります。
  • 私のライブラリ DAO クラスは、いくつかの理由から、RDBMS 型と密接に関連する型を使用しています。まず、ライブラリは、基になるデータ ストア内のストレージの自動作成と更新をサポートしているため、クラスにはテーブルを作成するのに十分な情報が必要です。次に、データの移行がはるかに簡単になり、最適化が可能になります (たとえば、ネイティブ インターフェイスを使用して、ODBC/OLEDB データを直接コピーできます)。欠点は、DAO オブジェクトに「適切な」クラス型を含めることができないことです (例: 実際の文字列バッファーよりも多くのデータを持つ文字列の抽象化)。
  • 確かに、私はオンデマンドで作成します。これは、実際にメモリに格納できるよりもはるかに多くのデータがストアに存在する可能性があるためです。
  • DAO クラスをシンプルに保ち、アクセサー機能を最小限に抑え、基になるデータ構造に「近づける」ようにしています。つまり、他の DAO クラスからの継承はなく、インスタンスにはキー変数メンバーなどがあります。

DAO クラスの上に、アプリケーション内のデータを表す、よりアクセスしやすいクラスを作成します。1-1 を DAO クラスにマップする場合とマップしない場合があります。これらは、任意のタイプのメンバーと構造体を持つことができ、アプリが使用するものであることが想定されており、それらの基礎となる DAO クラスとの間でデータをコピーするメソッドがあります。

それが役立つことを願っています。

于 2008-10-13T17:35:15.373 に答える
0

私は最良の実装を知りませんが、これが私が見たものです:

  1. インスタンスごとに分けます。
  2. 必要になる直前に作成され、直後に破棄されます。
  3. わからない。
  4. DAO インスタンスの外部でデータを結合して、結合を回避します。

免責事項:これは私が見たものです。

于 2008-12-05T21:31:35.747 に答える