【機能紹介】ハンドラ
BIG-Modelアプリケーションでは、さまざまなところでハンドラが機能しています。
ハンドラ機能の原型はBBS.pmのハンドラモジュールになりますが、このモジュールは1つのルーチンしか保持することができないため、BIG-Modelアプリケーションでは1つのハンドラに多くのルーチンを保持するように拡張したものを用意しています。
これにより、命令1つで、ハンドラに登録するすべてのルーチンを呼びだすことが可能になります。
では、実際、どのように機能しているのか説明します。
その前に
ハンドラはメイン処理の途中で割り込んで処理をするような処理のことで、条件(トリガやイベント)によって実行するようなものをおおむねイベントハンドラと称していることもあり、多く知られていると思います。
まず、下のログイン画面を見てください。
この画面を開発する際、下のような、機能別に分割したユーティリティモジュールを作成しました。
(1) Connect (接続メッセージを表示)
(2) Hello(タイトル画面を表示)
(3) Login(ログイン処理を行う)
(4) Entrance(ログインユーザの準備およびお知らせの表示)
(5) Menu(汎用メニューおよびプロンプトの表示)
このなかのEntranceユーティリティでは、
や
のようなメッセージバナーの表示を、また、Menuのユーティリティでは、
のような電報着信の通知を行うときにハンドラを使用しています。
仕組み
ここではメッセージバナーの表示について説明します。
ちなみにパッケージ名のルールとして、コマンドとして呼び出されるような機能をユーティリティモジュール(BIGModel::Utilities)、コマンドとして呼び出すのではなく、モジュール内で機能するようなものを汎用モジュール(BIGModel::Generic)としています。また、拡張ハンドラモジュールのようなシステムの一部として担うようなモジュールをシステムモジュール(BIGModel::System)としています。
各モジュールの連携図は次の通りです。
/* ここから編集中 */
Entranceはログインユーザが保持するデータの取得とパラメータ設定を行い、最後にバナーやお知らせなどの表示を行うユーティリティモジュールですが、バナー表示を行う処理はCalendarという汎用モジュールに収録されていて、このモジュールが呼び出されるようにしています。
Calenderはログインした時刻値(0~23)に対応したメッセージ(バナー)を取得し、取得したメッセージをノードに送出します。
Entranceにバナーを表示するためにハンドラを作成しますが、ハンドラの作成はローダルーチンで行います。
Calendarは、バナーを表示する処理、Entranceに作成したハンドラにを追加しますが、これもローダルーチンで行います。
EntranceもCalendarも、どちらもローダルーチンを使用して処理を行いますが、
ローダはアプリケーションサーバが開始される直前で、各モジュールに定義されているサブルーチンload()を呼び出しますが、ローダ処理は少し難点があります。それはのちほど説明します。