プラグイン機能を追加するための提案はありますか?
-
08-06-2019 - |
質問
拡張機能をコードにプログラミングするための一般的な手順はありますか?
システムのコア コードを変更するのではなく、ある種のプラグイン API を介して機能を拡張できるように、作成中のシステムに拡張タイプの機能を追加するための一般的な手順は何なのか疑問に思っています。
このようなことはシステムが書かれた言語に依存する傾向があるのでしょうか、それともこれを可能にする一般的な方法はあるのでしょうか?
解決
これは通常、自分で公開する必要があるものなので、システムが記述されている言語に依存します(ただし、多くの場合、他の言語のラッパーを作成することも可能です)。
たとえば、Windows の場合、C で書かれたプログラムがある場合、プラグインはプログラムの DLL として作成されます。実行時にこれらの DLL を手動でロードし、それらの DLL に何らかのインターフェイスを公開します。たとえば、DLL は gimme_the_interface()
関数ポインタで満たされた構造体を受け入れることができる関数。これらの関数ポインターにより、DLL は呼び出しを行ったり、コールバックを登録したりすることができます。
C++ を使用している場合は、DLL システムを使用しますが、構造体の代わりにオブジェクト ポインターを渡すことになるでしょう。また、オブジェクトは機能を提供するインターフェイスを実装します (構造体と同じことを実現しますが、それほど見苦しくはありません)。Java の場合、DLL の代わりにクラス ファイルをオンデマンドでロードしますが、基本的な考え方は同じです。
どのような場合でも、プラグインを初期化し、プラグインが操作できるように、コードとプラグインの間に標準インターフェイスを定義する必要があります。
追伸C++ プラグイン システムの良い例を見たい場合は、以下をチェックしてください。 foobar2000 SDK. 。しばらく使用していませんでしたが、とても丁寧に作られていました。今もそうだと思います。
他のヒント
私は過去にプラグインにイベントベースの API を使用したことがあります。イベントをディスパッチし、アプリケーションの状態へのアクセスを提供することで、プラグインのフックを挿入できます。
たとえば、ブログ アプリケーションを作成している場合、新しい投稿がデータベースに保存される直前にイベントを発生させ、必要に応じて変更するためにプラグインに投稿の HTML を提供することができます。
この一般的な質問については、デザイン パターンの本を紹介したいと思います :p
正直なところ、答えはノーだと思います。デフォルトでは拡張可能なコードを作成することはできません。作成/拡張するのが難しく、非常に非効率的になります (Mozilla は非常に拡張性があるという考えからスタートし、あらゆる場所で XPCOM を使用していましたが、今ではそれが間違いであることに気づき、削除し始めています)意味のないところ)。
意味のあることは、有意義に拡張できるシステムの部分を特定し、これらの場合に適切な API をサポートすることです (例:エディターの言語サポート プラグイン)。関連するパターンを使用しますが、具体的な実装はプラットフォーム/言語の選択によって異なります。
IMO では、動的言語を使用することも役立ちます。これにより、実行時に (絶対に必要な場合) コア コードを微調整することが可能になります。Firefox の拡張機能を作成するときに、Mozilla の拡張性がそのように機能することを高く評価しました。
あなたの質問には 2 つの側面があると思います。
拡張可能なシステムの設計 (設計パターン、制御の反転、その他のアーキテクチャ面) (http://www.martinfowler.com/articles/injection.html)。そして、少なくとも私にとって、これらのパターン/テクニックはプラットフォーム/言語に依存せず、「一般的な手順」と見なすことができます。
現在、それらの実装は言語とプラットフォームに依存します (たとえば、C/C++ にはダイナミック ライブラリなどがあります)。
プラグ可能性や拡張性を提供するプログラミング環境を提供するために、いくつかの「フレームワーク」が開発されていますが、他の人が言及しているように、すべてをプラグ可能にすることにあまり夢中にならないでください。
Java の世界では、OSGi (http://en.wikipedia.org/wiki/OSGi) いくつかの実装がありますが、私の個人的な最良の実装は Equinox (http://www.eclipse.org/quinox/)
プラグイン ライターに課す最小要件を調べてください。次に、コードをいつどこで実行するかを知るために、作成者がコードに実装する必要がある 1 つ以上のインターフェイスを作成します。
作成者がコード内の一部の機能にアクセスするために使用できる API を作成します。
ライターが継承する必要がある基本クラスを作成することもできます。これにより、API の接続が容易になります。次に、ある種のリフレクションを使用してディレクトリをスキャンし、要件に一致するクラスを見つけてロードします。
システム用のスクリプト言語を作成したり、既存の言語のサブセットのインタプリタを実装したりする人もいます。これも行けるルートです。
結論は次のとおりです。コードをロードするときは、あなたの想像力だけがあなたを止めることができるはずです。
幸運を。
C や C++ などのコンパイル済み言語を使用している場合は、スクリプト言語によるプラグインのサポートを検討することをお勧めします。Python と Lua は両方とも、多数のアプリケーションのスクリプトに使用される優れた言語です (Civ4 と Blender は Python を使用し、Supreme Commander は Lua を使用します)。
C++ を使用している場合は、boost Python ライブラリをチェックしてください。それ以外の場合、Python には C で使用できるヘッダーが付属しており、C/Python API を文書化するのに非常に優れています。Lua のドキュメントはあまり完全ではないように見えましたが、私が十分に調べていなかったのかもしれません。いずれにせよ、膨大な量の作業を行わなくても、かなり堅牢なスクリプト プラットフォームを提供できます。これはまだ簡単ではありませんが、作業を行うための非常に優れた基盤となります。