プラグインモジュールシステムを構築する

約3年前、アイデアは、プラグイン、拡張機能の助けを借りて機能を迅速かつ効率的に拡張できるシステムのカーネルを作成する方法を探していました。 同時に、製品開発中にプラグイン作成者が経験する問題、多くのプラグインの互換性の問題を最小限に抑える必要がありました。



一方では、タスクは問題ではなく、開発者にシステムを操作するための豊富なAPIを提供するのに十分です。 しかし、一方で、システムの研究に多大な労力が必要になる場合、人気が上がることはありません。 急速に成長しているプロジェクトの注意深いドキュメントはしばしば機能しないため、初心者プラグイン作成者がすべてが最短時間でどのように機能するかを理解できるようにする最も簡単なメカニズムを使用する必要があります。



この記事は、プロジェクトの実装のために同様のアーキテクチャのアイデアを探している初心者プログラマを対象としています。







システムコア



モジュール構造のシステムのコアは通常、次のようになります

システムコア



コアは、システム内で情報フローを実行するのに役立つ一連の基本機能です。 カーネルは、システム全体の作業全体を調整します。



システムは、特別なメソッドまたはカーネルオブジェクト(要求マネージャー)を処理する要求を受信します。そのタスクは、ユーザーの要求に応じてシステムが行う必要があることを決定することです。



モジュールはカーネルに接続されています。 モジュールは特定の関数/メソッドのセットであり、その一部は公開されています。 ユーザーが実行できるようにします。 パブリックオブジェクトメソッドと混同しないでください。 モジュールの機能はパブリックメソッドでもかまいませんが、これはシステムが機能するための前提条件ではありません。 たとえば、ニュースモジュールには、ニュースのリストの表示、特定のニュースの表示、ニュースの作成、ニュースの編集、ニュースの削除、ニュースの公開など、いくつかの機能があります。



モジュールはコアを介してのみ相互作用する必要があります。そうしないと、マルチモジュラーシステムを構築するのは難しくありませんが、実際には非現実的です。



ハンドラー



最初のスキームのみに基づいてシステムを設計すると、必要な効果を達成できません。 新しいモジュールを実装するには、ゼロから設計と実装が必要です。 また、既存のモジュールを変更する場合は、既存のモジュールのパッチのパス、またはモジュールの完全なコピーとその後の改善のパスに沿って進む必要があります。 しかし、システムは静止しておらず、モジュールの互換性の開発により深刻な影響を受けます。 パッチが機能しなくなる可能性があります。 製品の新しいバージョンは深刻な脆弱性や重大なバグを修正する可能性があるため、更新を常に監視する必要があります。



これは、ハンドラーが救助に来る場所です。 ハンドラーは、コード実行のプロセスで制御を転送できる特定の機能です。



次に、すべてのパブリック関数を次のフォームに入力しましょう。

ハンドラー

これは抽象図であり、関数自体のコードではありません。



ハンドラーがインストールされていない場合の一般的な実行プロセスを検討してください。 抽象関数にonBeforeハンドラーを持たせます。これは、関数の作業本体を実行するプロセスの前に呼び出されます。 onAfterハンドラーは、関数の本体が何らかの有用な作業を行った後に実行されます。



ここに、 templateItという特別なブロックを追加しました。 これは、データテンプレートのプロセスに対する課題であり、その結果、htmlコードまたはその他のテキストドキュメントを取得します。 これは必須のブロックではなく、そうでない場合があります。



たとえば、特定のニュースを表示する関数を呼び出します。 関数の本体は必要なデータを選択し、テンプレートシステムに送信します。



実際には、もう少し複雑になります。

実行プロセス

システムはgetまたはpostリクエストを受信します。これは一連の指示とデータです。 指示はニュースモジュールを実行し、データはニュース識別子になります。 クエリマネージャーはデータと命令を分離する必要があり、カーネルはモジュールの目的の機能を要求し、そこに初期データを転送します。 この関数はリクエストを処理し、作業データをテンプレートシステムに送信します。これにより、美しいhtmlコードが作成されます。



ハンドラーは何を提供しますか?



簡単な例を挙げます。 システムはユーザーのリストを表示できます。 システムのVIP訪問者であるユーザーの異なるリストを持つモジュールを作成しました。 ユーザーのリストを表示するだけでなく、どのユーザーがVIP訪問者でもあるかを表示したいと考えました。



そのため、ユーザーのリストを形成する関数のonAfter-ハンドラーを追加する必要があります。 関数は、ユーザーのリストの形式でデータセットを受け取ります。 このリストの人物にVIPのサインを配置するだけで十分です。 ユーザーのリストを使用して元の関数からテンプレートをコピーし、そこで必要な変更を行う必要があります。



これで、ユーザーのリストを呼び出すと、新しいテンプレートが誇示されます。



紙上では見た目はきれいですが、常にきれいに実装されているとは限りません。 動的なコード実行では、カーネルがユーザーのリストを形成するモジュールに制御を移す前に、新しいモジュールを起動する必要があります。 そして、何をする必要があるのか​​誰が知っていますか? すべてのモジュールを一度に初期化しますか? 非常に効果的なソリューションではありません。



そして、手順を少し変更しましょう。



画像



特定の連鎖マネージャー(関係マネージャー:))を実行手順全体に追加します。その主なタスクは次のとおりです。 モジュール関数がハンドラーとして機能する場合、最初に接続マネージャーで宣言されます。 パブリック関数ハンドラーの実行とテンプレートデータの転送については、コミュニケーションマネージャーが責任を負います。 パブリック関数は、単に関数本体に縮退します。 その中には、データを処理する以外のコードはありません。



しかし、私たちは何かを逃しています。 モジュールが同じ言語で会話できるように、システム内のデータ転送全体を標準化する必要があります。



画像



複数の関数を相互リンクする場合、次に何をすべきかを知る必要があります。 たとえば、 a.a1を実行した後、特定のデータセットdata1チェーン命令のセットがあり、この関数がデータをテンプレートに変換する準備ができていることを示します。 ただし、この関数にはonAfterハンドラが定義されているため、 b.b1を実行する必要があります。これはdata2data1に追加しますが、この関数はテンプレートを変更しない場合があります。



同様に、この関数は独自のOnAfterハンドラーを持つこともできます。このハンドラーは、以前の関数のデータに基づいてデータを作成し、データウォーミング手順を実行する必要があると言います。 など、無限に。



すでにはるかに優れており、より柔軟です。 私の考えが、誰かの素晴らしいアイデアの実装に役立つことを願っています。



素敵なプログラミングをしてください!



UPD。 バグに取り組みます。



All Articles