2008-08-11 45 views
15

コードに拡張機能をプログラミングする一般的な手順はありますか?プラグイン機能を追加するにはどうすればよいですか?

システムのコアコードを変更するのではなく、プラグインAPIを使って機能を拡張できるように、エクステンションタイプの機能をシステムに追加する一般的な手順は何ですか?

このようなことは、システムが書かれた言語に依存する傾向にあるのですか、それを許容する一般的な方法がありますか?

答えて

3

これは一般にあなたが公開する必要があるため、システムが書かれている言語に依存します(他の言語のラッパーも作成することがよくあります)。

たとえば、Cで書かれたプログラムがWindowsの場合、プラグインはプログラムとしてDLLとして書き込まれます。実行時に、これらのDLLを手動でロードし、いくつかのインタフェースをそれらに公開します。たとえば、DLLは、関数ポインタでいっぱいの構造体を受け入れることができるgimme_the_interface()関数を公開する可能性があります。これらの関数ポインタは、DLLが呼び出し、登録コールバックなどを行うことを許可します。

もしあなたがおそらくstructの代わりにオブジェクトポインタを渡すことを除いて、DLLシステムを使用します。 (構造体と同じことを達成するが、あまり醜いことはない)機能を提供するインタフェースを実装する。 Javaでは、DLLではなくオンデマンドでクラスファイルをロードしますが、基本的な考え方は同じです。

すべての場合、プラグインを初期化できるように、コードとプラグインの間に標準インターフェースを定義する必要があります。

P.S. C++プラグインシステムの良い例を見たい場合は、foobar2000 SDKをチェックしてください。私はかなり長い間使っていませんでしたが、以前は本当にうまくいっていました。私はそれがまだあると思います。

+0

はい、私はそれがこのような答えになる恐れていました。それでも、プラグインが何をすることができるのかを完全に制御できるということです。 – kaybenleroll

1
  1. プラグインライターに付けたい最小要件を確認してください。次に、コードを実行するタイミングと場所を知るために、ライターが実装する必要のある1つ以上のインタフェースを作成します。

  2. ライターがコードの一部の機能にアクセスするために使用できるAPIを作成します。

ライターが継承する必要がある基本クラスを作成することもできます。これにより、APIの配線が容易になります。次に、何らかのリフレクションを使用してディレクトリをスキャンし、要件に合ったクラスをロードします。

また、システムによってはスクリプト言語を作成する人もいれば、既存の言語のサブセットにインタプリタを実装する人もいます。これも可能な道です。

ボトムラインは:コードを読み込むと、あなたの想像力だけがあなたを止めることができるはずです。
幸運。

4

過去にプラグインにイベントベースのAPIを使用しました。プラグインのフックを挿入するには、イベントをディスパッチし、アプリケーションの状態にアクセスできるようにします。

たとえば、ブログアプリケーションを作成する場合は、新しい投稿がデータベースに保存される直前にイベントを発生させ、ポストHTMLをプラグインに提供して必要に応じて変更することができます。私はこの一般的な質問のためのデザインパターンの本にあなたを指すように誘惑してい

2

:P

真剣に、私は答えはノーだと思います。デフォルトで拡張可能なコードを書くことはできません。書いたり伸ばしたりするのは難しいでしょう(Mozillaは非常に拡張性があり、どこでもXPCOMを使用していましたが、今は間違いであり、どこが理にかなっていない)。

重要なことは、意味のある拡張が可能なシステムの部分を特定し、これらの場合に適切なAPI(エディターでの言語サポートプラグインなど)をサポートすることです。関連するパターンを使用しますが、特定の実装はプラットフォーム/言語の選択に依存します。

IMOは、動的言語を使用するのにも役立ちます。実行時にコアコードを微調整することができます(絶対に必要な場合)。 Mozillaの拡張性は、Firefoxの拡張機能を書くときにそのように機能することがわかった。

1

CやC++などのコンパイル言語を使用している場合は、スクリプト言語を使用してプラグインのサポートを確認することをお勧めします。 PythonとLuaは、数多くのアプリケーションをスクリプト化する優れた言語です(Civ4とBlenderはPythonを使用し、Supreme CommanderはLuaを使用します)。

C++を使用している場合は、boost pythonライブラリをチェックしてください。さもなければ、PythonはCで使用できるヘッダーを持っていますが、C/python APIを文書化するのはかなり良い仕事です。ドキュメントはLuaにとってはあまり完全ではないように見えましたが、私は十分に頑張っていないかもしれません。いずれにしても、ひどい作業をせずに、かなり安定したスクリプティングプラットフォームを提供できます。それはまだささいなことではありませんが、それはあなたに働くための非常に良い基盤を提供します。

2

私はあなたの質問には2つの側面があると思います。

システムの設計を拡張する(デザインパターン、制御の反転およびその他のアーキテクチャの面)(http://www.martinfowler.com/articles/injection.html)。そして、少なくとも私にとっては、これらのパターン/技法はプラットフォーム/言語に依存せず、「一般的な手順」と見ることができます。

は今、彼らの実装は、言語やプラットフォームdependendである(C/Cで例えば++あなたは、などを動的ライブラリのものを持っている)

いくつかの「フレームワーク」はあなたを提供するプログラミング環境を提供するために開発されていますプラグイン可能/拡張性ですが、他の人が触れているように、プラグイン可能なものを作ることはあまりにも狂っていません。見て

Javaの世界で

良い仕様のOSGi(http://en.wikipedia.org/wiki/OSGi)は、いくつかの実装では春分(http://www.eclipse.org/equinox/)という最高の1私見です

関連する問題