【COBOL学習|豆知識】モダンCOBOLで挑む!多重定義(オーバーロード)の解決ルールを徹底解説

導入:なぜオーバーロードの解決順序を知る必要があるのか

COBOLといえば「定型業務の自動化」というイメージが強いですが、COBOL 2002以降のオブジェクト指向機能を使えば、JavaやC#のような柔軟なプログラムが可能です。その中で強力なのが「多重定義(オーバーロード)」です。しかし、引数の型が微妙に異なるメソッドが複数存在する場合、コンパイラが「どのメソッドを呼び出すべきか」をどう判断しているのか、その優先順位を理解していないと、意図しないバグを生む原因になります。今回は、静的型解析による解決順序の仕組みを解説します。

基礎知識:オーバーロード解決の仕組み

オブジェクト指向におけるオーバーロードとは、同じ名前のメソッドに対して、引数の数や型が異なる複数の定義を持たせることを指します。
COBOLのコンパイラは、コンパイル時に「どのメソッドが最も適切か」を以下の優先順位で判断します。
1. 引数の型が完全に一致するもの
2. 暗黙の型変換によって適合するもの(より小さな型から大きな型へなど)
3. 上記に該当するものが複数あり、絞り込めない場合は「曖昧(Ambiguous)」としてコンパイルエラー

実装/解決策:具体的な解決プロセス

コンパイラは、メソッド呼び出し時に渡された実引数の型と、定義されている仮引数の型を比較します。最も「距離が近い(型変換の負荷が少ない)」メソッドが選ばれます。例えば、数値型であれば「PIC 9(4) COMP」よりも「PIC 9(9) COMP」の方が、代入可能な範囲が広いため、後者が優先されるケースがあります。

サンプルプログラム:オーバーロードの動作確認

IDENTIFICATION DIVISION.
CLASS-ID. CALCULATOR.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.

REPOSITORY.
CLASS CALCULATOR.

OBJECT.

> メソッド1: 数値引数用
METHOD-ID. COMPUTE-VALUE.
LINKAGE SECTION.
01 IN-VAL PIC 9(4) COMP.
PROCEDURE DIVISION USING IN-VAL.
DISPLAY “呼び出されたのは:数値版(4桁)メソッドです。”
END METHOD COMPUTE-VALUE.

> メソッド2: 数値引数用(より大きな型)
METHOD-ID. COMPUTE-VALUE.
LINKAGE SECTION.
01 IN-VAL PIC 9(9) COMP.
PROCEDURE DIVISION USING IN-VAL.
DISPLAY “呼び出されたのは:数値版(9桁)メソッドです。”
END METHOD COMPUTE-VALUE.

END OBJECT.
END CLASS CALCULATOR.

> メイン側での呼び出しイメージ
> PIC 9(4) COMPの変数を渡すと、コンパイラは最も適合する
> 4桁版のメソッドを静的に選択します。

応用・注意点:現場で陥りやすい罠

現場で最も注意すべきは「型変換による曖昧さ」です。例えば、引数に「PIC X(10)」を渡した場合、それを数値に変換すべきか、文字列として扱うべきか、コンパイラが判断できずにエラーを吐くことがあります。
また、COBOLのレガシーなデータ定義(PIC句)は型が細かいため、オーバーロードを多用しすぎると解決順序が複雑化し、可読性が低下します。
「名前を分ける」ことと「オーバーロードする」ことのバランスを意識してください。基本は「処理の内容が同じで、入力データの型だけが違う場合」にのみオーバーロードを使い、それ以外は明確にメソッド名を変えるのが、ベテランの設計術です。

コメント

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