【COBOL学習|豆知識】継承の魔法:GLOBAL句でデータ共有をスマートに解決する

導入:なぜGLOBAL句が必要なのか

COBOLのプログラム開発において、親プログラムで定義したデータを、CALLで呼び出した子プログラムから参照したい場面は多々あります。通常であれば、Linkage Sectionを使って引数として受け渡すのが作法ですが、共通フラグや大量の管理テーブルを毎回引数に並べるのは、コードの可読性を下げ、保守を困難にします。そんな時、GLOBAL句を使えば、親の定義を子に「透過的」に共有でき、煩雑な引数指定から解放されます。

基礎知識:プログラムの静的構造とスコープ

COBOLでは、プログラムを入れ子(ネスト)にして記述することが可能です。通常、内部プログラム(子)から外部(親)のデータ項目を直接参照することはできません。しかし、データ定義にGLOBAL句を付加すると、その項目はそのプログラム内だけでなく、その中に含まれるすべての「入れ子になったプログラム」からも参照可能になります。いわば、プログラムの階層を越えて有効範囲(スコープ)を広げるためのキーワードです。

実装・解決策:GLOBAL句による共有の仕組み

GLOBAL句を指定したデータ項目は、そのプログラムがCALLされた際、子プログラム側のDATA DIVISIONで改めて定義し直す必要はありません。子プログラム側では、定義を意識せずにそのまま変数名を利用できます。これにより、共通エラーフラグやシステム定数などを管理する際、Linkageの定義ミスによる不整合を未然に防ぐことができます。

サンプルプログラム

以下のコードは、親プログラムで定義したグローバル変数を、子プログラムから直接参照する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. PARENT-PROG.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • GLOBAL句を付加することで子プログラムからも参照可能にする

01 WS-SYSTEM-STATUS PIC X(10) VALUE ‘NORMAL’ GLOBAL.

PROCEDURE DIVISION.
DISPLAY ‘親プログラム: ステータスは ‘ WS-SYSTEM-STATUS
CALL ‘CHILD-PROG’
DISPLAY ‘親プログラム: 子プログラム終了後のステータス ‘ WS-SYSTEM-STATUS
STOP RUN.

  • 入れ子構造のプログラム

PROGRAM-ID. CHILD-PROG.
PROCEDURE DIVISION.
DISPLAY ‘子プログラム: 親のステータスを拝借中…’

  • 引数なしでもWS-SYSTEM-STATUSが参照できる

MOVE ‘ERROR’ TO WS-SYSTEM-STATUS
EXIT PROGRAM.
END PROGRAM CHILD-PROG.

END PROGRAM PARENT-PROG.

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

GLOBAL句は非常に便利ですが、乱用には注意が必要です。

1. 影響範囲の把握が困難になる
どのプログラムがどのデータを変更しているのかが見えにくくなるため、大規模なシステムではデバッグ時に「誰がこの値を書き換えたのか?」という追跡が困難になります。重要なデータは極力引数で渡すのが安全です。

2. 名前衝突の回避
GLOBAL指定した項目名と、子プログラム内で独自に定義した項目名が重複すると、コンパイルエラーや意図しない動作を引き起こす可能性があります。共通項目には、プロジェクトで決めた独自のプレフィックス(例: GLB-)を付与するなど、命名規則を徹底しましょう。

この機能は「知っていると楽ができる」反面、「使いすぎると混乱を招く」両刃の剣です。保守性を考慮し、システム共通のステータス管理など、限定的な用途で活用することをお勧めします。

コメント

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