【COBOL学習|実務向け】PERFORM THRUにおける「飛び込み」の禁止と構造化プログラミングの鉄則

1. 導入:なぜ「飛び込み」が危険なのか

ベテランの現場で最も頭を抱えるバグの一つが、いわゆる「スパゲッティコード」です。特に、PERFORM THRUで定義された手続きの範囲内に、外部からGO TO文で直接ジャンプする「飛び込み」は、プログラムの制御フローを破壊する最大の要因です。なぜこれが重要かといえば、PERFORM文は実行終了後に「戻り先(リターンアドレス)」を保持する仕組みを持っています。この範囲内に無理やり割り込むと、COBOLコンパイラや実行環境が戻り先を正しく認識できなくなり、予期せぬ暴走やデッドロックを引き起こすからです。

2. 基礎知識:単一入口・単一出口の原則

構造化プログラミングの基本理念として「単一入口・単一出口(Single-Entry, Single-Exit)」という言葉があります。一つの処理ブロックには必ず一つの入口から入り、一つの出口から出るというルールです。PERFORM THRUは、指定した段落から終了段落までの範囲を一括で処理するための機能ですが、この範囲内は「不可侵領域」とみなすべきです。GO TO文で中間段落に飛び込むことは、この原則を真っ向から否定する行為であり、保守性を著しく低下させます。

3. 実装・解決策:構造化へのリファクタリング

もし、特定の処理を共通化したいのであれば、GO TOで飛び込むのではなく、以下のいずれかの方法を採用すべきです。
1. 共通処理を独立した段落(またはプログラム)として切り出し、必要な場所からPERFORMで呼び出す。
2. フラグ制御を行い、条件判定によって処理の流れを制御する。
これにより、コードの可読性が向上し、デバッグも容易になります。

4. サンプルプログラム

以下に、やってはいけない「飛び込み」を避け、構造化を守ったコード例を示します。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-STRUCTURE.

PROCEDURE DIVISION.
MAIN-PROCEDURE.

  • 良い例: PERFORMで適切に範囲を呼び出す

PERFORM SUB-ROUTINE-START THRU SUB-ROUTINE-END.
STOP RUN.

SUB-ROUTINE-START.
DISPLAY “処理開始”.
SUB-ROUTINE-MID.

  • ここに外部からGO TOで飛び込むのは厳禁

DISPLAY “中間処理”.
SUB-ROUTINE-END.
DISPLAY “処理終了”.
EXIT.

  • 補足:もし「中間処理」だけを呼び出したい場合は、
  • 別途独立した段落として定義し、再利用する設計にしてください。

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

現場では「修正工数を減らしたい」という理由で、既存のPERFORM範囲内にGO TOで割り込む修正を見かけることがありますが、これは「技術的負債」を倍増させる行為です。
注意点として、もしコンパイラが許容したとしても、それは論理的なバグを隠蔽しているに過ぎません。特に、EXIT段落を共通化している場合に飛び込むと、処理が終了せずに無限ループに陥ることもあります。
常に「PERFORMの出口はEXIT段落で制御する」ことを徹底し、複雑な制御が必要な場合は、IF文やEVALUATE文による条件分岐へ書き換える勇気を持ってください。それが、10年後も動く堅牢なコードへの第一歩です。

コメント

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