#プラグインフレームワーク - 原理
プラグインを使用する理由#
ソフトウェアの実装中に、特定の機能を動的に追加または削除したいと考えています。
一般的なプラグインフレームワーク#
プラグインの原理#
プラグイン管理#
フレームワークとは何ですか?
まず、フレームワークにはユーザー、フレームワーク自体、および拡張の 3 つの部分が必要です。ユーザーはホストであり、フレームワーク自体はマネージャーであり、ここでは拡張が具体的なプラグインです。
ライフサイクル#
機能を動的に追加または削除するには、ホストのライフサイクルをインターセプトして、特定の段階でプラグインの実装を追加する必要があります。インターセプトされるライフサイクルノードは、拡張ポイントです。
依存関係の管理#
フレームワークは、ホストのライフサイクルをインターセプトしてプラグインの実装を呼び出すだけでなく、プラグインの依存関係も管理する必要があります。一部のプラグインは相互に依存しています。
依存関係の実装#
- 静的:各プラグインは依存関係ツリーを宣言し、すべてのプラグインは依存関係グラフを生成し、依存関係グラフの順序(一部は並行)で初期化およびプラグインを呼び出します。
- 動的:プラグインを初期化および呼び出すときに依存関係をチェックし、再帰的な方法で動的に呼び出します。循環依存関係のチェックに注意する必要があります。依存関係グラフは、後で検証するための方法で循環依存関係があるかどうかをチェックできますが、動的な方法では循環依存関係を防ぐための他のメカニズムが必要です。
プラグインの実装#
- プラグインの一意の識別子
- プラグインの依存関係の宣言
- プラグインの拡張ポイントの宣言
- プラグインの実装
- プラグインのライフサイクル
フレームワークがホストのライフサイクルをインターセプトするのとは異なり、プラグインには独自のライフサイクルがあります。たとえば、プラグインの作成 / 破棄、ロード / アンロード、依存関係の設定などです。
プラグインフレームワーク - Android プラグインフレームワークの実装#
package framework{
package plugin{
interface IPluginApplication
interface IPlugin
class PluginApplication
PluginApplication --|> IPluginApplication
class PluginManager
class Plugin
Plugin --|> IPlugin
PluginApplication --> PluginManager
PluginManager --> IPlugin
}
}
package app{
class MainApplication
MainApplication --|> PluginApplication
}
package features{
package features_a{
class FeatureAPlugin
}
package features_b{
class FeatureBPlugin
}
package features_n{
class FeatureNPlugin
}
FeatureAPlugin --|> Plugin
FeatureBPlugin --|> Plugin
FeatureNPlugin --|> Plugin
}
ホストのライフサイクル#
interface IPluginApplication {
fun onCreate()
fun onTerminate()
fun onLowMemory()
fun onTrimMemory(level: Int)
fun onConfigurationChanged(newConfig: Configuration)
}
ホストのライフサイクルをインターセプト#
open class PluginApplication : MultiDexApplication(), IPluginApplication {
lateinit var proxy: IPluginApplication
override fun onCreate() {
proxy = PluginApplicationProxy(this)
super.onCreate()
proxy.onCreate()
}
override fun onTerminate() {
super.onTerminate()
proxy.onTerminate()
}
override fun onLowMemory() {
super.onLowMemory()
proxy.onLowMemory()
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
proxy.onTerminate()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
proxy.onConfigurationChanged(newConfig)
}
}
class PluginApplicationProxy(val application: Application) : IPluginApplication {
override fun onCreate() {
}
override fun onTerminate() {
}
override fun onLowMemory() {
}
override fun onTrimMemory(level: Int) {
}
override fun onConfigurationChanged(newConfig: Configuration) {
}
}
プラグイン管理#
interface IPlugin {
fun onCreate()
fun onTerminate()
fun onLowMemory()
fun onTrimMemory(level: Int)
fun onConfigurationChanged(newConfig: Configuration)
}
object PluginManager {
private val plugins = mutableListOf<IPlugin>()
fun init(application: Application) {
//プラグインを検索
//依存関係グラフを生成 //次
}
fun add(plugin: IPlugin) {
plugins.add(plugin)
}
fun remove(plugin: IPlugin) {
plugins.remove(plugin)
}
}