【COBOL学習|豆知識】モダンCOBOLの作法:RETURNING句を活用した安全な値の受け渡し

なぜRETURNING句が重要なのか

COBOLの長年の慣習として、副プログラムからの値の受け取りには、特殊レジスタである「RETURN-CODE」を使用するのが一般的でした。しかし、RETURN-CODEは全域(グローバル)で共有されるため、複数の処理が絡み合う複雑なシステムでは、値の予期せぬ上書きや競合が発生するリスクがありました。

モダンCOBOL(COBOL 2002以降)で導入された「RETURNING句」は、この課題を解決します。関数的な記法で呼び出し元に変数を直接戻すことができるため、データのスコープを限定し、保守性と安全性を飛躍的に高めることが可能です。

基礎知識:RETURNING句とは

RETURNING句は、CALL文やINVOKE文において、呼び出されたプログラム(あるいはメソッド)が計算結果を直接返却するために使用する構文です。

これまでの「USING」句は、引数を参照(または値渡し)で渡すためのものでしたが、RETURNING句は「関数の戻り値」のように扱われます。これにより、呼び出し元では「計算結果を格納する変数」を指定するだけで、明示的なデータ転送の手間を省くことができます。

実装の考え方

RETURNING句を使用する際は、呼び出される側のプログラムでも「PROCEDURE DIVISION」のヘッダーに「RETURNING」を指定する必要があります。これにより、呼び出し側と呼び出される側で、戻り値の型とサイズを明確に一致させることができます。

サンプルプログラム

以下の例は、2つの数値を加算して結果を呼び出し元へ返却するプログラムです。

呼び出し側プログラム:
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-A PIC 9(4) VALUE 100.
01 VAL-B PIC 9(4) VALUE 200.
01 RESULT PIC 9(5).
PROCEDURE DIVISION.
> SUB-ADDを呼び出し、結果をRESULTに直接受け取る
CALL “SUB-ADD” USING VAL-A VAL-B RETURNING RESULT.
DISPLAY “計算結果: ” RESULT.
STOP RUN.

呼び出されるプログラム:
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-ADD.
DATA DIVISION.
LINKAGE SECTION.
01 IN-A PIC 9(4).
01 IN-B PIC 9(4).
01 OUT-RES PIC 9(5).
PROCEDURE DIVISION USING IN-A IN-B RETURNING OUT-RES.
> 二つの値を加算して戻り値としてセット
COMPUTE OUT-RES = IN-A + IN-B.
EXIT PROGRAM.

応用・注意点

1. 型の不一致に注意: RETURNING句で指定する変数の型は、受け渡し側と呼び出し側の両方で厳密に一致させる必要があります。サイズが異なると、予期せぬデータ切り捨てやメモリ破壊の原因となります。
2. RETURN-CODEとの併用: RETURNING句を使ってもRETURN-CODEは依然として機能します。しかし、設計思想を統一するため、新規開発ではRETURNING句を優先し、エラー判定などは別の引数で行う設計をお勧めします。
3. 移植性の確認: お使いのコンパイラがCOBOL 2002規格に準拠しているか確認してください。古い環境ではRETURNING句がサポートされていない場合があります。

このTipsを活用することで、グローバル変数に依存しない、堅牢で読みやすいコードを目指しましょう。

コメント

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