私は、他のアプリケーションでも使用されるいくつかのモジュールで構成されるアプリケーションに取り組んでいます。これらの各モジュールにはいくつかの構成オプションが必要ですが、他のモジュールのオプションを認識してはならず、他のモジュールが存在する必要もありません。一部の設定はモジュール間で共有されます。
モジュール A には x と y の設定が必要で、モジュール B には y と z の設定が必要だとします。
設定は、レジストリまたは 1 つ以上の .ini ファイルに保存されます。
これまでのところ、次のアプローチを検討してきました。
- すべてのモジュールに含まれ、設定を含むグローバル変数を含むグローバル ユニット (「global.pas」) を用意します。このアプローチはあまり好きではありません。すべてのアプリケーションにそのようなユニットが必要になり、元の目的とは関係のない多くの追加コードを収集することになるからです。したがって、最終的には、各アプリケーションが独自の互換性のないグローバル ユニットを持つことになります。
- そのモジュールに必要なすべての設定を含む各モジュールの構成クラスを用意します。これらは、アプリケーションの中心点からモジュールに渡され、永続的な形式への読み取りと書き込みも処理されます (たとえば、JvAppStorage を使用します)。一部のオプションはモジュール間で共有されるため、これにはモジュール間の同期が必要です。そのため、あるモジュールでオプションが変更された場合、この変更は別のモジュールの構成に反映される必要があります (必ずしもリアルタイムではなく、次回のモジュール初期化されます)。
- 各モジュールに渡され、すべてのモジュールの設定をプロパティとして含む汎用構成クラスを用意します。各モジュールは、認識している設定のみにアクセスします。ここでの問題は、気付かないうちに名前の衝突が発生する可能性があることです。また、モジュールに不要な構成オプションを渡すという考えも好きではありません。さらに、すべてのアプリケーションにはモジュールの異なるサブセットが含まれますが、可能なすべてのモジュールのオプションを持つ同じ構成クラスが含まれることになります。(これは、上記のグローバル ユニット アプローチと大差ありません。)
- 上記のように、各モジュールに渡される汎用構成クラスを用意します。ただし、モジュールはプロパティを持つ代わりに、名前で設定にアクセスします (最も簡単な場合、これは TCustomIniFile になります)。これにより、すべてのアプリケーションですべてのモジュールの設定が使用可能になることは回避されますが、型の互換性の問題が発生する可能性があり、名前の衝突が問題になる可能性があります (各モジュールがそのオプションにその名前のプレフィックスを付けない限り、それらはオプションを共有できなくなります)。
モジュール化されたシステムを書いた人なら誰でもこの問題に直面し、気に入るかどうかにかかわらず、後になって行き詰まった解決策を見つけたことがあると思います。私も何度かそこに行ったことがありますが、今でも黄金の弾丸を探しています。
他の誰かがすでに理想的な解決策を見つけているのではないでしょうか?
(これは、重要な場合に備えて Delphi 2007 です。私はすでに JCL / JVCL を使用しています。)