【COBOL学習|実務向け】モダンCOBOL開発の要:GLOBAL句を用いたオブジェクト参照の共有

導入

大規模な基幹システムをCOBOLで構築する際、入れ子プログラム(Nested Programs)間のデータ受け渡しに苦労した経験はありませんか。引数を介したデータの受け渡しは、プログラムが複雑化するにつれ、メンテナンスの大きな足かせとなります。今回解説する「GLOBAL句」を付与したオブジェクト参照は、この課題を解決し、複数プログラム間で同一のインスタンスを直感的に共有するための強力な手法です。

基礎知識

COBOL(2002以降)における「GLOBAL句」は、そのデータ項目を定義したプログラムおよび、そのプログラムの中に含まれるすべての入れ子プログラムから参照可能にするための指定です。
「OBJECT REFERENCE」は、JavaやC#のようにオブジェクトを操作するための参照型変数です。これに「GLOBAL」を組み合わせることで、特定のインスタンスを「グローバルなセッション情報」や「共有サービス」として、階層の深いプログラムからも直接呼び出すことが可能になります。

実装/解決策

実装の基本は、最上位のプログラム(親プログラム)のWORKING-STORAGE SECTIONで、該当するオブジェクト参照に「GLOBAL」属性を付与することです。これにより、子プログラム側では改めて引数として渡す必要がなくなり、定義を参照するだけでインスタンスメソッドの呼び出しが可能になります。

サンプルプログラム

以下の例では、セッション管理クラスのインスタンスを親プログラムで生成し、子プログラムから直接参照する構成を示します。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. MAIN-PROG.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 GLOBAL句を付与し、入れ子プログラムから参照可能にする
000600 01 SESSION-MGR USAGE OBJECT REFERENCE GLOBAL.
000700 PROCEDURE DIVISION.
000800 インスタンスの生成(仮定)
000900 INVOKE SESSION-MANAGER-CLASS “NEW” RETURNING SESSION-MGR.
001000 子プログラムの呼び出し(引数なしでSESSION-MGRを共有)
001100 CALL “SUB-PROG”.
001200 GOBACK.
001300
001400 IDENTIFICATION DIVISION.
001500 PROGRAM-ID. SUB-PROG.
001600 DATA DIVISION.
001700 WORKING-STORAGE SECTION.
001800 ここで親プログラムのGLOBAL変数を継承・参照する
001900 01 SESSION-MGR EXTERNAL-REFERENCE.
002000 PROCEDURE DIVISION.
002100 SESSION-MGRを介してメソッドを呼び出す
002200 INVOKE SESSION-MGR “GET-USER-INFO”.
002300 EXIT PROGRAM.

応用・注意点

現場でこの機能を活用する際の注意点は、「競合状態(Race Condition)」です。グローバルなオブジェクトは便利ですが、複数のプログラムから同時にメソッドが呼び出されると、インスタンス内部のステートが予期せず書き換わるリスクがあります。
特にマルチスレッド環境を意識した開発を行う場合は、オブジェクト側のメソッド内で適切に排他制御(Mutexなど)を実装することを忘れないでください。また、過度なグローバル化はプログラムの依存関係を複雑にします。あくまで「セッション情報」や「共通コネクション」など、真に共有すべきリソースに限定して利用することをお勧めします。

コメント

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