質問

私はドメイン モデル クラスを含む C++ クラス ライブラリを開発しています。さまざまな永続化メカニズムからこれらのクラスをインスタンス化するためのサポートを追加したいと考えています。データベースとファイル。クラス ライブラリのユーザーには、永続化メカニズムとの間でデータを転送できるクラスをプログラムするためのインターフェイス (?) が与えられる必要があります。

Java で機能すると思われるデータ アクセス オブジェクト パターンについては知っていますが、それを C++ に適用する方法は正確にはわかりません。他の解決策はありますか?

役に立ちましたか?

解決

C++ は多重継承をサポートしているため、汎用の永続 API を使用して永続メカニズムを継承できます。これでもクラスのメタデータを取得するためにイントロスペクションを使用する必要がありますが、どの永続層でもこの問題は依然として発生します。

あるいは、同様のことを行うこともできますが、メタデータを使用して、永続化レイヤーの「ゲッター」と「セッター」を埋めるコード ジェネレーターを駆動することもできます。

通常、永続層はいずれかのアプローチを使用するため、問題は読み込みメカニズムを永続層にフックすることです。これにより、問題は単一の永続層とは少し異なりますが、別の方向から取り組むことができると思います。永続性フレームワーク上にドメイン クラスを構築するのではなく、サードパーティがデータ アクセス メカニズムをプラグインできる永続性フレームワークのフックを備えた一連のドメイン クラスを提供します。

クラスのメタデータとコールバックへのアクセスを提供すれば、永続化メカニズムは比較的簡単だと思います。便利な C++ O/R マッピング フレームワークのメタデータ コンポーネントを見て、それらがどのように機能するかを理解します。これをドメイン クラスの基本クラスの 1 つの API でカプセル化し、インスタンス化または永続化のための汎用のゲッター/セッター API を提供します。残りは永続層を実装する人次第です。

編集: あなたが説明しているタイプのプラグイン可能な永続化メカニズムを備えた C++ ライブラリは思いつきませんが、このタイプの機能を追加できる可能性のあることを Python で実行しました。特定の実装では、直接 C++ に相当するものがない Python の機能を使用しましたが、基本原理はおそらく C++ で動作するように適合させることができます。

Python では、オーバーライドすることでインスタンス変数へのアクセスをインターセプトできます。 __getattr()__ そして __setattr()__. 。永続化メカニズムは実際には、舞台裏で独自のデータ キャッシュを維持していました。この機能がクラスに混合されると (多重継承によって行われます)、メンバーのアクセスに関するデフォルトのシステム動作がオーバーライドされ、クエリされる属性がそのディクショナリ内のいずれかに一致するかどうかがチェックされます。これが発生した場合、呼び出しはデータ キャッシュ内の項目を取得または設定するためにリダイレクトされました。

キャッシュには独自のメタデータがありました。データ モデル内のエンティティ間の関係を認識し、データにアクセスするためにどの属性名をインターセプトするかを認識していました。この仕組みにより、データベース アクセス層から分離され、(少なくとも理論的には) 永続化メカニズムをさまざまなドライバーで使用できるようになった可能性があります。(たとえば) XML ファイルにシリアル化するドライバーを構築できなかったという本質的な理由はありません。

このようなものを C++ で動作させるのはもう少し面倒で、このシステムのようにオブジェクト キャッシュ アクセスを透過的にすることはできないかもしれません。おそらく、オブジェクトの状態をキャッシュにロードしてフラッシュする明示的なプロトコルを使用するのが最適でしょう。このコードはキャッシュ メタデータからの生成に非常に適していますが、これはコンパイル時に行う必要があります。テンプレートを使用するか、 -> しかし、これはおそらく、価値があるというよりも面倒です。

他のヒント

ブーストシリアル化 C++ 型のシリアル化を操作するための非常に便利な機能がいくつか提供されていますが、それが希望するインターフェイスにどの程度一致するかはわかりません。侵入型設計と非侵入型設計の両方をサポートしているため、非常に柔軟です。

私の意見では、シリアル化は避けたいと思います。私たちは 1995 年に MFC のアプリケーションの 1 つにこれを実装しました。私たちは独立したオブジェクトのバージョン管理とファイルのバージョン管理を使用するのに十分賢明でしたが、時間が経つと、大量の古い乱雑なコードが残ることになります。

特定のシナリオ、非推奨のクラス、非推奨のメンバーなどを想像してください。それぞれが新たな問題を引き起こします。圧縮された「XML タイプ」ストリームを使用するようになり、新しいデータを追加して下位互換性を維持できるようになりました。

ファイルの読み取りと書き込みは、データをオブジェクトにマッピングすることから抽象化され、コア ビジネス オブジェクトを変更せずにファイル形式を切り替えたり、インポータ/エクスポータを追加したりできるようになりました。

そうは言っても、一部の開発者はシリアル化を好みますが、私自身が遭遇したのは、コードベース、プラットフォーム、言語、ツールキットの切り替えはすべて多くの問題を引き起こし、データの読み取りと書き込みがその中に含まれるはずがないということです。

さらに、独自のキーを備えた標準データ形式を使用すると、サードパーティとの連携がはるかに簡単になります。

見てみたいかもしれません シリアル化を促進する. 。使用していないので、お勧めかどうかは言えません。ブースト ライブラリは通常、高品質です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top