【COBOL学習|初心者向け】COBOLで実現する「関数テーブル」:プログラム動的呼び出しの極意

1. 導入:なぜ「関数テーブル」が必要なのか

COBOL開発において、条件分岐が多いプログラムで「IF文」や「EVALUATE文」を何十行も書いた経験はありませんか?条件が増えるたびにコードが肥大化し、保守性が低下するのは避けたい課題です。
「関数テーブル」は、実行したい処理(サブプログラム)のアドレスを配列として保持し、添字(インデックス)を指定するだけで呼び出し先を切り替える手法です。これにより、プラグイン方式のような柔軟な設計が可能になり、コードの見通しが劇的に改善されます。

2. 基礎知識:PROCEDURE-POINTERとは

通常のCOBOLプログラムでは「CALL ‘SUB-PROG’」のようにプログラム名を直接記述しますが、これでは静的にしか呼び出せません。
ここで登場するのが USAGE PROCEDURE-POINTER です。これは「プログラムのメモリ上の開始アドレス」を保持するための特殊な型です。このポインタを配列(OCCURS)として定義することで、プログラムのアドレス一覧表、つまり「関数テーブル」が完成します。

3. 実装:プログラムのアドレスを管理する手順

実装の流れは非常にシンプルです。
1. PROCEDURE-POINTER型の配列を定義する。
2. SET文を使って、各要素に呼び出したいプログラムのエントリポイント(アドレス)を代入する。
3. 実行時に、配列の添字を指定して CALL文 を発行する。

4. サンプルプログラム

以下のコードは、入力値に応じて異なるサブプログラムを呼び出す例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 5つのサブプログラムを格納できるテーブルを定義

05 WS-FUNC-TABLE USAGE PROCEDURE-POINTER OCCURS 5.
05 WS-INDEX PIC 9 VALUE 1.

PROCEDURE DIVISION.

  • 1. 各サブプログラムのアドレスをテーブルにセット

SET WS-FUNC-TABLE(1) TO ENTRY ‘SUB-PROG-A’
SET WS-FUNC-TABLE(2) TO ENTRY ‘SUB-PROG-B’
SET WS-FUNC-TABLE(3) TO ENTRY ‘SUB-PROG-C’

  • 2. 添字を指定して呼び出し(例:2番目のプログラムを呼ぶ)

MOVE 2 TO WS-INDEX.

  • CALL文の対象にポインタ変数を指定するだけで動的に遷移

CALL WS-FUNC-TABLE(WS-INDEX)

GOBACK.

5. 応用・注意点:現場で陥りやすい罠

関数テーブルを使用する際は、以下の点に注意してください。

呼び出し先が存在しない場合:
SET文で指定したプログラムがリンク時に見つからない、あるいは呼び出しに失敗すると、実行時エラーが発生します。プログラムを呼び出す前に、ポインタがNULLでないかを確認するロジックを入れるのがベテランの作法です。

動的ロードの活用:
この手法を応用すると、設定ファイルからプログラム名を読み込み、動的にロードして関数テーブルに登録する「プラグイン型システム」が構築できます。これにより、メインプログラムを改修することなく、新しい機能(サブプログラム)を追加できるようになります。

大規模な基幹システムでこの手法を取り入れれば、複雑なロジックをスッキリと整理できるはずです。ぜひ試してみてください。

コメント

タイトルとURLをコピーしました