導入
大規模な基幹システム開発において、共通領域の管理は避けて通れない課題です。特に、複数のサブプログラム(子プログラム)を呼び出すような階層構造を持つシステムでは、データの受け渡しのために引数(USING)を多用しすぎて、保守性が低下することが多々あります。今回解説する「GLOBAL句」は、親プログラムで定義したデータを、その配下のすべてのサブプログラムから「引数なし」で直接参照可能にする仕組みです。これにより、共通フラグや制御コードの管理を劇的にスマートにできます。
基礎知識
COBOLにおけるデータのスコープ(有効範囲)は、通常、そのデータが定義されたプログラム内に限定されます。しかし、現代のCOBOLコンパイラ(GNU COBOLやEnterprise COBOL等)では、GLOBAL句を付与することで、そのデータ定義の有効範囲を「そのプログラム」および「そのプログラムにネストされた(または呼び出された)プログラム」まで拡張できます。これは、複雑な引数の連鎖を断ち切り、特定の階層内で安全にデータを共有するための強力なツールです。
実装/解決策
GLOBAL句を使用する際は、親プログラムのWORKING-STORAGE SECTIONで定義を行います。ポイントは、データを定義したレベル番号の直後にGLOBALを記述することです。これにより、サブプログラム側では特別な準備をすることなく、親プログラムで定義された項目名がそのまま参照可能になります。ただし、設計上の原則として「データの所有者(親)」と「利用者(子)」を明確に分け、安易な書き換えを防止する運用ルールを設けることが重要です。
サンプルプログラム
以下の例では、親プログラム(MAIN-PROG)で定義した「システム制御フラグ」を、子プログラム(SUB-PROG)から直接参照する実装例を示します。
[親プログラム:MAIN-PROG]
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
WORKING-STORAGE SECTION.
- GLOBAL句により、この下位プログラムから参照可能にする
01 WS-CONTROL-AREA GLOBAL.
05 WS-SYSTEM-MODE PIC X(01) VALUE ‘N’.
PROCEDURE DIVISION.
MOVE ‘Y’ TO WS-SYSTEM-MODE.
CALL ‘SUB-PROG’.
STOP RUN.
[子プログラム:SUB-PROG]
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-PROG.
PROCEDURE DIVISION.
- 引数定義(USING)なしで、親のデータを直接参照
IF WS-SYSTEM-MODE = ‘Y’
DISPLAY ‘親から渡された制御モード: 有効’
END-IF.
EXIT PROGRAM.
応用・注意点
現場での運用において最も注意すべきは「意図しない書き換え」です。GLOBAL項目は広範囲からアクセス可能なため、デバッグ時に「どのプログラムが値を変更したか」を追跡するのが困難になる場合があります。
回避策として、書き込み(SET/MOVE)は親プログラムに集約し、子プログラムからは「参照(READ-ONLY)」のみを行うというコーディング規約を設けることを強く推奨します。また、多重の階層構造で同じ名前の項目をGLOBAL定義すると、意図しないスコープの衝突が発生するため、項目名には必ずプログラム識別子を含めるなどの命名規則を徹底してください。

コメント