【PL/I学習|豆知識】メインフレーム開発の「GENERIC属性」で実現する、スマートな手続き管理術

導入:なぜGENERIC属性が必要なのか

メインフレームのPL/I開発において、数値の型(FIXED BINやFIXED DECなど)ごとに異なる演算ルーチンを作成した経験はありませんか?引数の型が変わるたびに「CALC_B」「CALC_D」のように別々の名前を付け、呼び出し側で条件分岐させるのは、コードの可読性を下げ、保守を困難にする大きな要因です。GENERIC属性を使えば、一つの「論理的な名前」で状況に応じた適切な手続きを自動選択させることができます。これにより、呼び出し側のコードを劇的にシンプルに保つことが可能になります。

基礎知識:GENERIC属性とは何か

GENERIC属性は、現代のプログラミング言語における「メソッド・オーバーロード」をPL/Iで実現する仕組みです。コンパイル時または実行時に、引数の型(属性)をチェックし、あらかじめ定義された具体的な「物理的なルーチン」へ処理を振り分けます。これにより、プログラマは「型を意識せずに手続きを呼ぶ」という抽象化されたコーディングが可能になります。

実装・解決策:GENERICの定義方法

GENERIC属性を利用するには、まず各型に対応する個別の手続きを作成し、それらを束ねる「代表名」をGENERIC属性で宣言します。

1. 型ごとの具体的な処理(CALC_BINなど)を作成する。
2. 呼び出し用インタフェースとして、GENERIC属性を付与した宣言を行う。
3. 呼び出し側は、属性を意識せず「代表名」のみを使用して手続きを呼び出す。

サンプルプログラム

以下のコードは、FIXED BIN型とFIXED DEC型の両方に対応する計算手続きのサンプルです。

/ 呼び出し側の定義 /
DCL CALC GENERIC(
CALC_BIN WHEN(FIXED BIN),
CALC_DEC WHEN(FIXED DEC)
);

/ 以下、メイン処理での呼び出し例 /
DCL I_VAL FIXED BIN(31) INIT(10);
DCL D_VAL FIXED DEC(15,2) INIT(10.50);

CALL CALC(I_VAL); / 自動的にCALC_BINが呼ばれる /
CALL CALC(D_VAL); / 自動的にCALC_DECが呼ばれる /

/ 物理的な処理ルーチン /
CALC_BIN: PROC(P_VAL);
DCL P_VAL FIXED BIN(31);
/ ここにBIN型の計算ロジックを記述 /
END CALC_BIN;

CALC_DEC: PROC(P_VAL);
DCL P_VAL FIXED DEC(15,2);
/ ここにDEC型の計算ロジックを記述 /
END CALC_DEC;

応用・注意点:現場での活用と落とし穴

1. 型の厳密な一致に注意
GENERIC属性による選択は、引数の属性が宣言と完全に一致する必要があります。もし定義されていない型(例えばFLOAT型など)を渡すと、コンパイルエラーや予期せぬ動作を招くことがあります。デフォルトの動作を定義したい場合は、OTHERWISE句(コンパイラの実装に依存します)の利用を検討するか、厳密な型変換を行ってください。

2. Javaなどのオブジェクト指向への橋渡し
この手法は、メインフレームからJavaなどのモダン言語へシステムを移行する際、非常に有効な設計指針となります。既存のGENERIC定義は、そのままJavaのクラス設計における「同名メソッドのオーバーロード」へ1対1でマッピングできるため、リファクタリングの指針としても非常に優秀です。

3. 複雑化の防止
あまりに多くの条件をGENERICに詰め込みすぎると、どのルーチンが呼ばれているのかを追いかけるのが困難になります。基本的には、似た目的を持つ手続きの「インターフェース統一」に留めるのが、現場での保守性を守るコツです。

コメント

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