0

Delphi アプリで 2 つのデータ モジュール (TDMA、TDMB) が必要な状況があります。各データモジュールには同じデータ オブジェクト名 (クエリ、テーブルなど) がありますが、異なるコンポーネント セット (TZQuery、TADOQuery) からのものです。複数のデータベースをサポートしたいのですが、すべてのデータベースがコンポーネント スイートでサポートされているわけではないため、これが必要です。どのデータモジュールにアクセスする必要があるかは、DBFlag ブール変数によって決まります。データアクセスごとにほぼ同一のコードセグメントを分離する以外に、より効率的な方法はありますか?

DMG のようなグローバル データモジュール変数を DBFlag に基づいて DMA または DMB に設定できれば、コードは DMA または DMB の代わりに DMG を参照できます。それは理想的であり、コードの変更はほとんど必要ありませんが、私の知る限り不可能です。

4

2 に答える 2

1

DataModules私の提案は、特定のデータセットに基づいた構築をやめることです。のみを使用してそれらを構築しTClientDataSet、すべてのコードを記述するか、すべてDataSourcesをこれらのデータセットにリンクします。次にDataModules、特定のデータセットを保持するために他を作成し、選択方法を使用して、CDS インスタンスのデータ プロバイダーとして応答するものを選択します。それを行うためにインターフェイスを使用するというアイデアは、確かに優れています。

このアプローチでは、重複するコードをすべて削除し、ビジネス ロジック (CDS 内のデータを処理するコード) を永続性 (データ サーバーとの間でデータ行を転送するコード) から分離します。

于 2014-07-28T10:46:10.433 に答える
0

グローバル変数、またはより良いのは関数またはシングルトン クラス、またはおそらく最も良いのは、ブール値フラグに応じて dmA と dmB が共通に持っているものの抽象化への参照を返すインターフェイスを持つことです。ただし、正確にどのように行うかは、慎重に検討することで得られます。プロジェクトとその要件の詳細を知っているのは自分だけなので、そのほとんどは自分で行う必要があります。

ただし、いくつかの潜在的な問題があり、現在削除されているコメントが提案されているように、データモジュールを廃止 (または非表示) し、代わりにカスタム DB オブジェクトまたはインターフェイスを使用して提供する実装に導く可能性が高いと思われます。フォーム、レポートなどからの消費者アクセス

大きな問題の 1 つは、Delphi とその IDE でオブジェクトの可視性が機能する方法に関するものです。

DB オブジェクトのコンシューマとなるユニット MyForm1u を持つプロジェクトを考えてみましょう。そして、IDE デザイナーを介して追加した DB コンポーネントを含むユニット dmAu および dmBu は、両方のユニットで同じ名前を持つことができますが、異なるインスタンス タイプにすることができます。

現在、MyForm1u は確かに dmAu と dmBu を使用できますが、dmA と dmB の DB コンポーネントが公開されている必要があるという問題があります (ストリーム可能で IDE で設計可能であるためには、公開されている必要があるため)。したがって、dmA または dmB (のインスタンス) を返す関数を使用できますが、MyForm1u が dmAu および dmBu を使用する場合、それらへのアクセスがその関数を介してのみ行われるように、それらのカプセル化を強制するものは何もありません。

あなたができることは、共通の祖先データモジュールを定義し、ユニット dmCAu でそれを dmCA と呼び、そこから dmA と dmB を派生させることです。代わりに dmCA にいくつかのコンポーネントを配置したい場合は、DFM ファイルを手動で編集してコンポーネントの祖先を調整します。しかし、新たに始めると、同じインスタンス タイプのdmA と dmB の間で共通する DB コンポーネントを含む新しい dmCA をプロジェクトに簡単に作成し、IDE でそこから dmA と dmB を派生させることができます。

これにより、myFormu1 が dmAu または dmBu を直接使用せず、dmCA と言う人もいるプロジェクト構造が得られます。より良いアプローチは、それらのいずれも使用せず、何らかのクラスを返す関数を含むユニット X、またはより良いインターフェイスを使用することです。これには、dmA および dmB のコンポーネントへの参照を返す関数のグループがあります。名前(実際に重要なのは、データモジュールのデータモデル内での機能です)と先祖のタイプの点で共通です。

function MyDataSet1 : TDataSet;

ブール値フラグに応じて、dmA の AdoQuery1 または dmB の SqlQuery1 を返すことができるようにします。

コンシューマー ユニットの場合、内容のカプセル化を強制する dmAu、dmBu、dmCAu ではなく、ユニット X のみを使用します。

このクラスベースまたはインターフェースベースのアプローチは、TmyForm1 のような消費者オブジェクトを、IDE のオブジェクトインスペクターのおかげで通常のポイントアンドクリックアプローチを使用して DB オブジェクトに「結び付ける」ことを妨げますが、最近では、それは悪いことではないと多くの人が言うでしょう。

于 2014-07-28T07:12:59.670 に答える