プラグイン システムを実装するにはどのような方法がありますか?
-
01-07-2019 - |
質問
私は言語固有の答えをあまり求めていません。プラグイン システムを実装するための一般的なモデルだけを探しています (知りたければ、私は Python を使用しています)。私には独自のアイデア (コールバックを登録するだけ) がありますが、他のアイデアが存在することは知っています。通常は何が使用され、他に何が合理的ですか?
プラグインシステムとはどういう意味ですか?依存関係の注入と IOC コンテナーは良いソリューションのように思えますか?
つまり、基本プログラムを変更せずに機能を挿入する方法です。始めたときはそれを定義するつもりはありませんでした。依存関係の注入はそうではありません 見て 私がやっていることに特に適していますが、それらについてはあまり知りません。
解決
とても良いものがあります エピソード の ソフトウェアエンジニアリングラジオ, 、興味があるかもしれません。
今後の参考のために、ここに「イネーブラーのルール" (代替リンク)優秀な成績で与えられました Eclipse への貢献 エリック・ガンマ、ケント・ベック著。
- 招待ルール - 可能な限り、他の人にあなたの貢献に貢献してもらいます。
- 遅延読み込みルール - 投稿は必要な場合にのみ読み込まれます。
- 安全なプラットフォームのルール - 拡張ポイントのプロバイダーとして、拡張者側の不正行為から身を守る必要があります。
- フェア プレイ ルール - すべてのクライアントは、私も含めて同じルールに従ってプレイします。
- 明示的な拡張ルール - プラットフォームを拡張できる場所を明示的に宣言します。
- 多様性ルール - 拡張ポイントは複数の拡張を受け入れます。
- 適切なフェンスのルール - コードの外に制御を渡すときは、自分自身を保護してください。
- 明示的な API ルール - API を内部から分離します。
- 安定性ルール - 誰かを貢献に招待したら、ルールを変更しないでください。
- 防御的な API ルール - 自信がある API のみを公開しますが、クライアントの要求に応じてさらに多くの API を公開する準備をしてください。
他のヒント
単純なプラグイン アーキテクチャでは、プラグインが実装する必要があるすべてのメソッドを含むプラグイン インターフェイスを定義できます。プラグインはアプリケーションからのイベントを処理し、アプリケーションの標準コード、モデル オブジェクトなどを使用できます。物事を成し遂げるために。基本的には ASP.NET フォームと同じですが、実装ではなくオーバーライドする点が異なります。
この部分は誰も教えてくれなかったし、私も専門家ではありませんが、私は次のように感じています。一般に、プラグインはアプリケーションよりも安定性が低いため、アプリケーションは常に制御し、プラグインに定期的に動作する機会のみを与える必要があります。プラグインがオブザーバーを登録できる場合は、デリゲートへの呼び出しを試行/キャッチする必要があります。
Python では、によって提供されるエントリポイント システムを使用できます。 setuptools
そして pkg_resources
. 。各エントリ ポイントは、プラグインに関する情報 (名前、作成者、セットアップおよび破棄関数など) を返す関数である必要があります。
どうでしょうか 抽象的な工場?基本プログラムは抽象概念が相互に作用する方法を定義しますが、呼び出し元は実装を提供する必要があります。