【COBOL学習|実務向け】COBOLにおけるループ脱出の鉄則:EXIT PERFORMを活用した構造化プログラミング

1. 導入:なぜEXIT PERFORMが必要なのか

COBOL開発において、ループ処理(PERFORM文)は避けて通れません。しかし、従来の「PERFORM文の終了条件(UNTIL句)」だけで複雑なビジネスロジックを制御しようとすると、フラグ変数が乱立し、コードの可読性が著しく低下します。特に、特定の異常を検知した瞬間にループを抜けたい場面において、EXIT PERFORMは、コードのスパゲッティ化を防ぎ、保守性を高めるために不可欠なツールです。

2. 基礎知識:インラインPERFORMと制御構文

COBOL 85以降で導入された「インラインPERFORM(PERFORM … END-PERFORM)」は、プログラムの構造を可視化する上で非常に重要です。この範囲内で使用されるEXIT PERFORMは、他言語における「break」命令と全く同じ役割を果たします。これを使うことで、ループの先頭に戻ることなく、即座にループ構造の外へ制御を移すことが可能になります。

3. 実装・解決策:スマートなループ脱出

実務では、配列の検索やファイル読み込みのループ内で、特定の条件を満たした瞬間に処理を打ち切りたいことが多々あります。「見つかったら即座に終了する」というロジックを記述する際、フラグを立ててUNTIL句で判定するよりも、ループ内で直接EXIT PERFORMを叩く方が、ロジックの意図が明確になり、バグの温床となるフラグの管理ミスを減らすことができます。

4. サンプルプログラム

以下のコードは、テーブル検索において対象が見つかった瞬間にループを抜ける実用的な例です。

[プログラム例]
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-EXIT.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-ITEM OCCURS 5 TIMES PIC X(10).
01 WS-SEARCH-KEY PIC X(10) VALUE “TARGET”.
01 WS-INDEX PIC 9(01).
01 WS-FOUND-POS PIC 9(01) VALUE 0.

PROCEDURE DIVISION.
> テストデータ初期化
MOVE “DATA1” TO WS-ITEM(1)
MOVE “TARGET” TO WS-ITEM(2)
MOVE “DATA3” TO WS-ITEM(3)

> 検索処理
PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 5
IF WS-ITEM(WS-INDEX) = WS-SEARCH-KEY
> 見つかったら即座にループを抜ける
MOVE WS-INDEX TO WS-FOUND-POS
EXIT PERFORM
END-IF
END-PERFORM.

> 結果表示
IF WS-FOUND-POS > 0
DISPLAY “見つかりました。位置: ” WS-FOUND-POS
ELSE
DISPLAY “見つかりませんでした。”
END-IF.

STOP RUN.

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

EXIT PERFORMを使用する際に最も注意すべき点は「ネストされたPERFORM文」です。多重ループ(入れ子状のループ)の内側でEXIT PERFORMを実行すると、抜けるのは「直近の(最も内側の)ループのみ」となります。外側のループまで一気に抜けたい場合は、EXIT PERFORMではなく、専用の段落(SECTION)を作成し、GO TO文を用いた脱出が必要になるケースもあります。

また、古い仕様のコンパイラではインラインPERFORM自体がサポートされていない場合もありますが、現代のエンタープライズ開発では積極的に活用すべき構文です。コードの意図を明確にするためにも、複雑なUNTIL条件を記述する前に、まずはEXIT PERFORMでシンプルに書けないか検討してみてください。

コメント

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