1. 導入:なぜGLOBAL属性が必要なのか
COBOLで複数のプログラム(入れ子プログラム)を書く際、データの受け渡しに頭を悩ませたことはありませんか?通常、データを共有するにはLinkage Sectionを使い、引数として値を渡すのが一般的です。しかし、階層が深くなると引数の管理が煩雑になり、コードが読みづらくなることがあります。そんな時に役立つのがGLOBAL属性です。「親で定義した変数を、子プログラムから直接見に行けるようにする」この仕組みを使えば、引数だらけのインターフェースから解放されます。
2. 基礎知識:GLOBAL属性とは
COBOLにおけるGLOBAL属性とは、データ項目の「有効範囲(スコープ)」を拡張する指示語です。
通常、データ項目は定義したプログラム内でのみ有効ですが、GLOBALを付加すると、そのプログラムの中に含まれる「入れ子プログラム(Nested Program)」からもそのデータを直接参照・更新できるようになります。いわば、親子間での「共通の小部屋」を作るようなイメージです。
3. 実装/解決策:定義のルール
実装は非常にシンプルです。データ定義の末尾に「GLOBAL」と記述するだけです。
ただし、注意点として「定義した場所よりも外側のプログラムからは見えない」というルールがあります。あくまで「親から子へ」の一方通行的な共有範囲の拡大であると覚えておきましょう。
4. サンプルプログラム
以下のコードは、親プログラムで定義した変数を、入れ子になった子プログラムからそのまま参照・更新する例です。
[コード例]
IDENTIFICATION DIVISION.
PROGRAM-ID. PARENT-PROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
- GLOBAL属性を付加して共有可能にする
01 WS-COMMON-DATA PIC X(20) GLOBAL VALUE ‘初期値’.
PROCEDURE DIVISION.
DISPLAY ‘親プログラム: ‘ WS-COMMON-DATA.
CALL ‘CHILD-PROG’.
DISPLAY ‘親プログラム(更新後): ‘ WS-COMMON-DATA.
STOP RUN.
- 入れ子プログラムの開始
IDENTIFICATION DIVISION.
PROGRAM-ID. CHILD-PROG.
PROCEDURE DIVISION.
- 親のデータを直接参照
DISPLAY ‘子プログラム: ‘ WS-COMMON-DATA.
- 親のデータを直接書き換え
MOVE ‘子で書き換えました’ TO WS-COMMON-DATA.
EXIT PROGRAM.
END PROGRAM CHILD-PROG.
END PROGRAM PARENT-PROG.
5. 応用・注意点:現場で陥りやすい罠
GLOBAL属性は便利ですが、使いすぎには注意が必要です。
バグの回避策:
・副作用に注意: どこからでも書き換え可能になるため、大規模なプログラムで多用すると「いつ、誰がデータを変えたのか」が追跡困難になります。共有するのは「定数」や「システム全体で使うフラグ」など、限定的な用途に留めるのがベテランの流儀です。
・名前の衝突: 子プログラム側で、親と同じ名前の変数を定義してしまうと、子側の変数が優先されます(シャドーイング)。「うっかり親の変数を書き換えるつもりで、自分の変数をいじっていた」というミスが起きやすいため、変数名にはプレフィックス(WS-など)を付ける運用を徹底しましょう。
この属性を正しく使いこなして、無駄な引数渡しを減らし、スッキリとしたCOBOLソースコードを目指してください。

コメント