【機能紹介】ハンドラ

【機能紹介】ハンドラ

BIG-Modelアプリケーションでは、さまざまなところでハンドラが機能しています。

ハンドラ機能の原型はBBS.pmのハンドラモジュールになりますが、このモジュールは1つのルーチンしか保持することができないため、BIG-Modelアプリケーションでは1つのハンドラに多くのルーチンを保持するように拡張したものを用意しています。

これにより、命令1つで、ハンドラに登録するすべてのルーチンを呼びだすことが可能になります。

では、実際、どのように機能しているのか説明します。

その前に

ハンドラはメイン処理の途中で割り込んで処理をするような処理のことで、条件(トリガやイベント)によって実行するようなものをおおむねイベントハンドラと称していることもあり、多く知られていると思います。

まず、下のログイン画面を見てください。

** Connect **                                                               (1) 
                                                                            (2) 
・・・・・・・・・・・・・・・・・・・・                                        
・・・・・・・・・・・・・・・・・・・・                                        
   ★ ☆ ★ ☆ ★ ☆ ★ ☆                                             
  ★☆★☆★☆★☆★☆★☆★☆★☆★☆                                          
☆・BIG-Modelお試し版ネット・★                                        
  ★☆★☆★☆★☆★☆★☆★☆★☆★☆                                          
   ☆ ★ ☆ ★ ☆ ★ ☆ ★                                             
・・・・・・・・・・・・・・・・・・・・                                        
・・・・・・・・・・・・・・・・・・・・                                        
  ・guestID      = `GUEST`      ・                                          
 ・usersID/PASSWORD = `USERS/USERS`・                                          
 ・sysopID/PASSWORD = `SYSOP/SYSOP`・                                          
                                                                                
      IDを入力してください : SYSOP                                        (3) 
パスワードを入力してください : #####                                            
                                                                                
▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼                            (4) 
 こんにちは。いや、そろそろ、こんばんはかな?                                  
▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△                                
・                      ・                                
・当システムはBIG-Modelのサンプルシステムです ・                                
・                      ・                                
                                                                            (5) 
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・      
☆[A] 自動ダウンロード     [L] アンケート           [#] 電報            ★      
★[B] 電子掲示板           [M] メールボックス       [U] 端末環境変更    ☆      
☆[C] チャット             [N] 新アーティクル探索   [W] アクセス状況通知★      
★[D] ナツメ書籍データベース  [O] 新アーティクル見出し [X] 全シグ探索      ☆      
☆[E] 終了                 [P] プログラムコーナー   [Z] ハムレットゲーム★      
★[H] ヘルプファイル       [Q] 企業内BBSサンプル    [?] ヘルプ          ☆      
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・      
** 電報が届きました **                                                          
-NUM-  -R.DATE- -R.TIME- -SENDER-  -TELEGRAM-                                   
00001  21-06-27 18:30:26 BIGMODEL  どうも、はじめまして。                       
00002  21-06-27 18:30:26 BIGMODEL  BIG-Modelの世界へ、ようこそ!                
** 以上 **                                                                      
<00:00>選択してください ( [?] ヘルプ ) :                                        

この画面を開発する際、下のような、機能別に分割したユーティリティモジュールを作成しました。

(1) Connect (接続メッセージを表示)
(2) Hello(タイトル画面を表示)
(3) Login(ログイン処理を行う)
(4) Entrance(ログインユーザの準備およびお知らせの表示)
(5) Menu(汎用メニューおよびプロンプトの表示)

このなかのEntranceユーティリティでは、

▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼
 こんにちは。いや、そろそろ、こんばんはかな?
▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△

・                      ・                                
・当システムはBIG-Modelのサンプルシステムです ・                                
・                      ・                                

のようなメッセージバナーの表示を、また、Menuのユーティリティでは、

** 電報が届きました **                                                          
-NUM-  -R.DATE- -R.TIME- -SENDER-  -TELEGRAM-                                   
00001  21-06-27 18:30:26 BIGMODEL  どうも、はじめまして。                       
00002  21-06-27 18:30:26 BIGMODEL  BIG-Modelの世界へ、ようこそ!                
** 以上 **                                                                      

のような電報着信の通知を行うときにハンドラを使用しています。

仕組み

ここではメッセージバナーの表示について説明します。

ちなみにパッケージ名のルールとして、コマンドとして呼び出されるような機能をユーティリティモジュール(BIGModel::Utilities)、コマンドとして呼び出すのではなく、モジュール内で機能するようなものを汎用モジュール(BIGModel::Generic)としています。また、拡張ハンドラモジュールのようなシステムの一部として担うようなモジュールをシステムモジュール(BIGModel::System)としています。

各モジュールの連携図は次の通りです。

20210627 121240

/* ここから編集中 */

Entranceはログインユーザが保持するデータの取得とパラメータ設定を行い、最後にバナーやお知らせなどの表示を行うユーティリティモジュールですが、バナー表示を行う処理はCalendarという汎用モジュールに収録されていて、このモジュールが呼び出されるようにしています。

Calenderはログインした時刻値(0~23)に対応したメッセージ(バナー)を取得し、取得したメッセージをノードに送出します。

Entranceにバナーを表示するためにハンドラを作成しますが、ハンドラの作成はローダルーチンで行います。

Calendarは、バナーを表示する処理、Entranceに作成したハンドラにを追加しますが、これもローダルーチンで行います。

EntranceもCalendarも、どちらもローダルーチンを使用して処理を行いますが、

ローダはアプリケーションサーバが開始される直前で、各モジュールに定義されているサブルーチンload()を呼び出しますが、ローダ処理は少し難点があります。それはのちほど説明します。

Task Runner