【COBOL学習|実務向け】OMITTEDキーワード活用術:引数の動的制御でサブプログラムをスマートに

1. 導入:なぜOMITTEDが必要なのか

COBOLのCALL文において、すべての引数を毎回フルに渡す設計は、柔軟性に欠けることがあります。特定の処理条件でしか必要のない引数のためにダミーデータを用意するのは、メモリの無駄であり、保守性も低下させます。そこで役立つのが「OMITTED」キーワードです。これを活用することで、引数の有無を呼び出し側で制御し、サブプログラムの汎用性を劇的に高めることができます。

2. 基礎知識:OMITTEDとOPTIONALの関係

OMITTEDは、CALL文の引数リストにおいて「この位置には何も渡さない」という明示を行うキーワードです。これを受け取る側(サブプログラム)では、受け取りたい引数に対して「OPTIONAL」句を指定する必要があります。このペアを理解することで、一つのサブプログラムを「引数あり・なし」の両パターンに対応させることが可能になります。

3. 実装・解決策

実装のポイントは、呼び出し側で「OMITTED」を指定し、受け取り側で「IF ARGUMENT-PRESENT」関数(またはそれに準ずる判定ロジック)を使用して、その引数が実際に渡されたかをチェックすることです。これにより、引数が渡されなかった場合にエラーになることを防ぎ、デフォルト値を設定するなどの制御が可能になります。

4. サンプルプログラム

【呼び出し側 (CALLER)】
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
PROCEDURE DIVISION.
> PARM-2を渡さずに呼び出す例
CALL “SUB-PROG” USING PARM-1, OMITTED, PARM-3.
GOBACK.

【受け取り側 (SUB-PROG)】
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-PROG.
LINKAGE SECTION.
01 ARG-1 PIC X(10).
01 ARG-2 PIC X(10) OPTIONAL. > OPTIONAL指定が必須
01 ARG-3 PIC X(10).

PROCEDURE DIVISION USING ARG-1, ARG-2, ARG-3.
> 引数ARG-2が渡されたか判定する
IF ARGUMENT-PRESENT(ARG-2) THEN
DISPLAY “ARG-2は提供されました: ” ARG-2
ELSE
DISPLAY “ARG-2はOMITTEDです。デフォルト値を設定します。”
MOVE “DEFAULT” TO ARG-2
END-IF.
GOBACK.

5. 応用・注意点

現場での注意点として、すべての環境やコンパイラがOPTIONAL句を完全にサポートしているわけではない点に留意してください。また、OMITTEDを多用しすぎると、インターフェースの仕様が複雑になり、どの引数が必須でどれが省略可能か、設計書を見ないと判断できない「ブラックボックス化」を招く恐れがあります。

「引数を省略できる」という機能は強力ですが、あくまでサブプログラムの再利用性を高めるための補助手段として使用し、インターフェース設計の段階で文書化を徹底することを推奨します。特にレガシーな環境から移行する際は、既存のCALL文の挙動を壊さないよう、単体テストでの入念な確認を忘れないでください。

コメント

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