1. 導入:なぜ今、FUNCTION-IDが必要なのか
業務システム開発の現場において、長年COBOLを扱っていると「似たような計算ロジックが複数のプログラムに散らばっている」という状況に直面することがあります。従来はCALL文で外部プログラムを呼び出し、引数に結果を格納する方法が一般的でしたが、これではコードが冗長になりがちです。
COBOLのFUNCTION-IDとRETURNING句を活用すれば、自作ロジックを「組み込み関数」のように扱えるようになります。これにより、計算式の中に直接ロジックを組み込めるため、可読性が劇的に向上し、保守の手間を削減することが可能です。
2. 基礎知識:FUNCTION-IDとRETURNING句の役割
一般的なPROGRAM-IDで定義されたモジュールは、CALL文で呼び出し、引数(USING句)を経由して値をやり取りする必要があります。一方、FUNCTION-IDで定義されたモジュールは、以下の特徴を持ちます。
・関数呼び出し:式の中で関数名(引数)として記述できる。
・RETURNING句:関数の戻り値を指定する。
これにより、複雑な計算式を1行で記述できるようになり、プログラム全体がスッキリと整理されます。
3. 実装と解決策
FUNCTION-IDを実装する際は、呼び出し元と呼び出し先の両方でその関数が「存在すること」をコンパイラに認識させる必要があります。特に、関数名が重複しないよう命名規則を徹底することが重要です。
処理の流れとしては、関数内で計算を行い、RETURNING句に指定したデータ項目に結果を格納します。呼び出し側は、その関数名を式の一部として評価するだけで値を受け取れます。
4. サンプルプログラム
以下の例は、2つの数値を加算して消費税を算出する実用的な関数です。
- 関数側(FUNCTION-ID)
FUNCTION-ID. CALC-TAX-FUNCTION.
DATA DIVISION.
LINKAGE SECTION.
01 L-VAL-1 PIC 9(05).
01 L-VAL-2 PIC 9(05).
01 L-RESULT PIC 9(08) RETURNING.
PROCEDURE DIVISION USING L-VAL-1 L-VAL-2.
- 2つの数値を加算し、消費税(1.1倍)を計算して返す
COMPUTE L-RESULT = (L-VAL-1 + L-VAL-2) 1.1.
GOBACK.
END FUNCTION CALC-TAX-FUNCTION.
- 呼び出し側(メインプログラム)
WORKING-STORAGE SECTION.
01 WS-TOTAL PIC 9(08).
PROCEDURE DIVISION.
- 式の中で直接関数を呼び出す
COMPUTE WS-TOTAL = CALC-TAX-FUNCTION(1000, 2000) + 500.
DISPLAY “計算結果: ” WS-TOTAL.
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
FUNCTION-IDを使用する際は、以下の点に注意してください。
・再帰呼び出しの制限:使用しているコンパイラが再帰呼び出しをサポートしているか必ず確認してください。
・パフォーマンス:極めて高い頻度で呼び出されるループ内で関数を多用すると、CALLに近いオーバーヘッドが発生する可能性があります。
・デバッグの難易度:式の中で関数を呼び出すと、ステップ実行時に計算過程が追いにくくなる場合があります。複雑な計算式を1行に詰め込みすぎず、適度に関数を分割するのがベテランの知恵です。
この手法を適切に使いこなすことで、レガシーなCOBOLコードを「モダンで保守性の高い資産」へと変貌させることができます。ぜひ次回の機能追加の際に試してみてください。

コメント