コードに拡張機能をプログラミングするための一般的な手順はありますか?
システムのコアコードを変更するのではなく、ある種のプラグインAPIを介して機能を拡張できるように、作成しているシステムに拡張タイプの機能を追加するための一般的な手順は何でしょうか。
そのようなことは、システムが書かれた言語に依存する傾向がありますか、それともこれを可能にする一般的な方法がありますか?
コードに拡張機能をプログラミングするための一般的な手順はありますか?
システムのコアコードを変更するのではなく、ある種のプラグインAPIを介して機能を拡張できるように、作成しているシステムに拡張タイプの機能を追加するための一般的な手順は何でしょうか。
そのようなことは、システムが書かれた言語に依存する傾向がありますか、それともこれを可能にする一般的な方法がありますか?
私は過去にプラグインにイベントベースのAPIを使用しました。イベントをディスパッチし、アプリケーションの状態へのアクセスを提供することで、プラグインのフックを挿入できます。
たとえば、ブログアプリケーションを作成している場合、新しい投稿がデータベースに保存される直前にイベントを発生させ、必要に応じて変更するために投稿のHTMLをプラグインに提供することができます。
これは一般的に自分自身を公開する必要があるものなので、そうです、システムが書かれている言語に依存します(ただし、他の言語のラッパーを書くことも可能です)。
たとえば、Cで記述されたプログラムがある場合、Windowsの場合、プラグインはプログラム用にDLLとして記述されます。実行時に、これらのDLLを手動でロードし、それらへのインターフェイスを公開します。たとえば、DLLは、gimme_the_interface()
関数ポインタで満たされた構造を受け入れることができる関数を公開する場合があります。これらの関数ポインタにより、DLLは呼び出しを行ったり、コールバックを登録したりできます。
C ++を使用している場合は、DLLシステムを使用しますが、構造体の代わりにオブジェクトポインターを渡す可能性があり、オブジェクトは機能を提供するインターフェイスを実装します(構造体と同じことを実現しますが、醜いものではありません)。Javaの場合、DLLの代わりにオンデマンドでクラスファイルをロードしますが、基本的な考え方は同じです。
いずれの場合も、プラグインを初期化してプラグインが相互作用できるように、コードとプラグインの間に標準のインターフェースを定義する必要があります。
PS C ++プラグインシステムの良い例を見たい場合は、foobar2000SDKをチェックしてください。久しぶりですが、よくできていました。まだそうだと思います。
この一般的な質問については、デザインパターンの本を紹介したいと思います: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)を参照してください。いくつかの実装があり、IMHOがEquinox(http://www.eclipse.org/equinox/)に最適です。
プラグインライターに適用する最小要件を確認します。次に、コードをいつどこで実行するかをコードが認識できるように、ライターが実装する必要のある1つ以上のインターフェイスを作成します。
ライターがコードの一部の機能にアクセスするために使用できるAPIを作成します。
ライターが継承しなければならない基本クラスを作成することもできます。これにより、APIの配線が簡単になります。次に、ある種のリフレクションを使用してディレクトリをスキャンし、要件に一致するクラスをロードします。
また、システム用のスクリプト言語を作成したり、既存の言語のサブセット用のインタープリターを実装したりする人もいます。これも可能なルートです。
結論は次のとおりです。コードをロードするとき、あなたの想像力だけがあなたを止めることができるはずです。
幸運を。
CやC++などのコンパイル言語を使用している場合は、スクリプト言語を介したプラグインのサポートを確認することをお勧めします。PythonとLuaはどちらも、多数のアプリケーションのスクリプトを作成するために使用される優れた言語です(Civ4とblenderはPythonを使用し、Supreme CommanderはLuaを使用します)。
C ++を使用している場合は、ブーストPythonライブラリを確認してください。それ以外の場合、PythonにはCで使用できるヘッダーが付属しており、C /pythonAPIを文書化するのにかなり良い仕事をします。Luaのドキュメントは完全ではないように見えましたが、私は十分に調べていなかった可能性があります。いずれにせよ、ひどい作業をせずに、かなり堅実なスクリプトプラットフォームを提供できます。それはまだ些細なことではありませんが、それはあなたに仕事をするための非常に良い基盤を提供します。