6

Delphi 2010 を使用して、モジュールまたはプラグインをサポートするプログラムを作成する必要があります。少し不自然ですが、データファイル/テキスト ファイルを変換するアプリがあるとします。30 の入力形式と、同じ 30 の形式を出力としてサポートします。最初のリリースでは、おそらくこれらの形式のいくつかのみが実装されるでしょう。私の課題は、データ駆動型のプロセス フローが必要だということです。

たとえば、PARSE_FILE ルーチンがあるとします。入力データ ファイル形式が「Format_A」の場合、PARSE_FILE を呼び出すと、PARSE_FILE ルーチンの他の 29 の異なるバージョンとは対照的に、PARSE_FILE_Format_A を使用することを認識している必要があります。

PARSE_FILE は単なる例です。おそらく、LOAD_FILE、GET_DELIMITER、PARSE_FILE などの60 の異なる共通関数を使用する予定ですが、これらの関数のそれぞれは、30 の異なる形式ごとに少し異なります。FORMAT_A を使用してファイルをロードする場合、これらの 60 の異なる共通ルーチンのそれぞれがこれらの 60 のルーチンの適切な「バージョン」を使用するには、どのような手法を使用できますか?

5 つの入力形式から始めて、後で他の形式を追加することに注意してください。したがって、この「マッピング」を一元的に定義する方法が必要です。したがって、これらのルーチンがコード全体で使用されている場合は、ルーチンの適切なバージョンが使用されます。ジェネリック版と呼んでも使えます。

4

1 に答える 1

5
  1. すべてのプラグイン モジュールがインターフェイス タイプで実装する必要がある一連の標準ルーチンを定義します。PARSE_FILEIFileFormatHandler関数などが含まれているとしましょう。
  2. インターフェイスの設計と職務の分離の原則に従い、一部の実装が関心を持たない、または実装できない関数をインターフェイスに配置することは避けてください。実装クラスが実装するかどうかを選択できる別のインターフェイスでオプション関数を定義します。たとえば、アプリで読み取れるが、さまざまな理由で書き込めないファイル形式があると予想される場合は、読み取り操作を 1 つのインターフェイスに配置し、書き込み操作を別のインターフェイスに配置する必要があります。
  3. Delphi ですべてのプラグインを作成する場合は、BPL パッケージを使用して共通のタイプを共有する必要があります。すべてのモジュールが共通のインターフェイス タイプを参照できるように、IFileFormatHandlerインターフェイス タイプを 1 つの BPL パッケージ (Common.bpl) に配置します。各プラグイン モジュール自体も独自の BPL パッケージに含まれています。(複数のファイル形式ハンドラーが同じ BPL パッケージに存在する可能性がありますが、ベースラインの例は BPL ごとに 1 つです)
  4. これがプラグイン アーキテクチャを構築する最初のスイングである場合は、同時に多言語サポートをカバーしようとしないでください。今のところ Delphi に固執します。アプリケーションとモジュールを Delphi で作成します。Delphi でモジュラー プロジェクトを構築して完成させたら、一歩下がって、Delphi 以外の言語で記述されたモジュールをサポートするための COM またはバイナリ インターフェイスの要件を理解することに時間を費やしてください。
  5. 共通の BPL パッケージでは、モジュールがホスト アプリケーションに自分自身を認識させるために呼び出すことができるグローバル関数も定義しますRegisterPlugin(name: string; instance: IFileFormatHandler)。これにより、プラグイン名とインスタンスが内部リストに登録され、ホスト アプリケーションはこのリストを使用して、利用可能なプラグインを見つけて呼び出すことができます。
  6. ファイル処理プラグイン モジュールごとに、共有 BPL パッケージで定義された共通インターフェイスを実装するクラスを定義します。クラスのユニット初期化で、RegisterPlugion() 関数を呼び出して、クラスをホスト アプリに登録します。
  7. ホスト アプリケーションは共通パッケージを使用し、モジュール パッケージはそれぞれ共通パッケージを使用します。
  8. ホスト アプリケーションは、共通インターフェイスで定義された関数を介してのみモジュールの実装と対話します。
  9. ホスト アプリケーションは、IS を使用して特定のモジュール オブジェクト インスタンスがオプション インターフェイスを実装しているかどうかをテストし、AS を使用してそのオプション インターフェイスを取得できます。
  10. インターフェイスは Delphi で参照カウントされるため、ホスト アプリケーションがモジュール オブジェクト インスタンスへの参照を保持している限り(RegisterPlugin などを介して)、モジュール インスタンスは存続し、メモリ内に保持されます。最後の参照が解放されると、モジュール インスタンスは破棄されます。
  11. ホスト アプリケーションは、LoadPackage または同様の fn を使用して、実行時にモジュール パッケージ bpls を見つけてロードする必要があります。
  12. アプリ全体でプラグイン モジュール インスタンスの 1 つのリストを共有すると、ほとんどのシングル スレッド アプリケーションで問題なく機能します。これらのプラグイン モジュールを複数のスレッドで同時に使用することが予想される場合は、モジュールのシングルトン インスタンスをメモリに保持する代わりに、この設計をファクトリ パターンに移行することを検討してください。複数のスレッドから安全に呼び出す必要がある 1 つのインスタンスを作成するよりも、ファクトリを使用して使用スレッド内でオンデマンドでインスタンスを構築することにより、マルチスレッドを管理する方がはるかに簡単で、通常はパフォーマンスが向上します。
于 2013-02-26T18:36:46.383 に答える