導入
システム保守の現場で、古くからあるソースコードを読み解いていると必ずと言っていいほど遭遇するのが「GO TO DEPENDING ON」です。これは、特定の数値によって処理を分岐させる「マルチジャンプ」命令です。現代のCOBOLではEVALUATE文を使うのが定石ですが、なぜ昔のコードでこの命令が使われていたのか、そして現代の開発でどう扱うべきかを理解しておくことは、レガシー資産を正しく保守するために非常に重要です。
基礎知識
GO TO DEPENDING ONは、指定したデータ項目の値が「1なら1番目の段落へ」「2なら2番目の段落へ」といった具合に、制御を動的に切り替える仕組みです。これを「ディスパッチテーブル」と呼びます。
例えば、メニュー画面の入力値(1:登録、2:修正、3:削除)に応じて処理を振り分ける際、IF文を何段も重ねる必要がなくなるため、当時は非常に効率的な書き方とされていました。
実装/解決策
この命令を使う際は、「値が範囲外(0や4以上)だった場合」の挙動に注意が必要です。GO TO DEPENDING ONは、指定した値が1未満、あるいはリストした段落の数を超えた場合、「直後の命令へ制御が流れる」という仕様になっています。この「素通り」する性質を理解していないと、意図しないバグを生む原因になります。そのため、必ず範囲外判定を直前に行うのが鉄則です。
サンプルプログラム
以下のコードは、入力値に応じて処理を振り分ける実用例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-DISPATCH.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CHOICE PIC 9(01).
PROCEDURE DIVISION.
> ユーザーからの入力を想定
MOVE 2 TO WS-CHOICE.
> 値が範囲内か事前にチェックする(重要)
IF WS-CHOICE < 1 OR WS-CHOICE > 3
DISPLAY “無効な値です”
GO TO PARA-EXIT.
> 1ならPARA-REG, 2ならPARA-UPD, 3ならPARA-DELへジャンプ
GO TO PARA-REG PARA-UPD PARA-DEL DEPENDING ON WS-CHOICE.
PARA-REG.
DISPLAY “登録処理を実行します”
GO TO PARA-EXIT.
PARA-UPD.
DISPLAY “更新処理を実行します”
GO TO PARA-EXIT.
PARA-DEL.
DISPLAY “削除処理を実行します”
GO TO PARA-EXIT.
PARA-EXIT.
STOP RUN.
応用・注意点
現代のCOBOL開発においては、EVALUATE文の使用を強く推奨します。EVALUATE文は視認性が高く、WHEN OTHER句で範囲外の制御も一箇所で完結できるため、保守性が格段に向上します。
もし皆さんの現場で古いプログラムを改修する機会があれば、無理にGO TO DEPENDING ONを修正する必要はありませんが、新規でロジックを組む際は、必ずEVALUATE文に置き換えてください。レガシーな構文を「知っている」ことは武器になりますが、最新の構文を「使いこなす」ことこそが、ベテランエンジニアの嗜みですよ。

コメント