プラグインを使用したC ++アプリケーションのデフォルト動作の変更[終了]
質問
簡単に言うと、ファクトリー+プラグインメカニズムを設計および実装する最良の方法は何ですか。これにより、プラグインはメインアプリケーションのオブジェクトを置き換えることができます。
アプリケーションを構築するコードベースがあります。コードベースは、アプリケーションの70〜95%で十分です。つまり、新しいアプリケーションごとに、デフォルトの動作の5〜30%を変更する必要があります(新機能の追加、デフォルトロジックの変更、GUIの追加など)。
実装はプラグインベースです:コードベースはEXEとDLLに組み込まれ、メインEXEが実行されているときに、必要な機能を追加するDLLをロードします。
現在、各プラグインは次の関数を公開しています:
PluginInterface* PluginInit()
{
return new MyCustomizedPluginInterface();
}
PluginInterfaceの定義場所:
class PluginInterface {
public:
virtual SomeClass1* customizedSomeClass1() = 0;
virtual SomeClass2* customizedSomeClass2() = 0;
};
およびSomeClass1 / SomeClass2にはデフォルトの動作がいくつかありますが、プラグインによってオーバーライドおよび変更できます。
現在の実装では、新しいカスタマイズされたクラスを追加することは困難です。メインアプリケーションのすべてのクラスをプラグインから置き換えたいので、オブジェクトファクトリを使用するのが理にかなっています。
私が知っている1つのSDKは、次の手法を使用しています。
PluginInterface* PluginInit(GodObject* godObject)
{
FactoryForSomeClasses* factoryForSomeClasses =
godObject->factoryForSomeClasses();
factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}
このアプローチに代わるものはあるのだろうか。
先ほど説明したようなプラグインシステム/ファクトリの設計と実装をどのようにお勧めしますか?
解決
この正確な問題について議論したドクター・ドッブの記事がしばらく前にありました。問題の記事へのリンクです。
余談ですが、プロジェクトへのプラグイン用に、まっすぐなCインターフェイスを使い続けることもできます。これにより、ほとんどすべての言語で記述されたコードを最小限の手間でフレームワークにリンクできます。 C ++は優れていますが、JavaやPythonの土地に存在する信じられないほどのフレームワークのように、C ++に存在するものよりも多くを活用できることは、長期的には有益であることがわかります。
他のヒント
プラグインフレームワークのCodeProjectの例を見ましたか? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx