導入:なぜオーバーロードの解決順序を知る必要があるのか
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句)は型が細かいため、オーバーロードを多用しすぎると解決順序が複雑化し、可読性が低下します。
「名前を分ける」ことと「オーバーロードする」ことのバランスを意識してください。基本は「処理の内容が同じで、入力データの型だけが違う場合」にのみオーバーロードを使い、それ以外は明確にメソッド名を変えるのが、ベテランの設計術です。

コメント