【COBOL学習|豆知識】COBOLの落とし穴:ピリオドによるIF文終了の危険性と現代的コーディング

なぜ「ピリオド」の扱いに注意が必要なのか

ベテランの現場では今でも古いソースコードを目にすることがありますが、そこで最もバグの温床となりやすいのが「ピリオド(.)」による制御構造の終了です。COBOLにおいて、IF文を閉じるためにEND-IFを使わず、末尾にピリオドを打つ書き方は非常に強力ですが、同時に「意図しないスコープの終了」を引き起こすリスクがあります。本稿では、この古い慣習がなぜ現代のプログラミングで非推奨なのか、そしてどのように記述すべきかを解説します。

基礎知識:スコープとピリオドの役割

COBOLのIF文には、「スコープ(適用範囲)」という概念があります。END-IFを明示的に記述した場合、そのIF文の終わりはその地点で確定します。しかし、ピリオドを記述すると、コンパイラはその時点で「開いているすべてのIF文やELSE文を強制的に終了する」という挙動をとります。つまり、ピリオドを1つ打つだけで、入れ子構造(ネスト)になっていた複数の条件分岐がすべて同時に閉じられてしまうのです。

実装と解決策:END-IFによる構造化

現代のCOBOL開発では、可読性と保守性を高めるために「明示的な終了スコープ(END-IF)」の使用が推奨されています。これにより、複雑な条件分岐であっても「どこでIFが閉じているか」が一目で分かります。

サンプルプログラム:推奨される書き方と危険な書き方の比較

以下のコードで、構造化の重要性を確認してください。

IDENTIFICATION DIVISION.
PROGRAM-ID. IF-EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-A PIC 9 VALUE 1.
01 W-B PIC 9 VALUE 1.
01 W-C PIC 9 VALUE 2.
01 W-D PIC 9 VALUE 0.

PROCEDURE DIVISION.

  • — 推奨スタイル: END-IFによる構造化 —

IF W-A = W-B
IF W-C = 2
MOVE 1 TO W-D
END-IF > ここで内側のIFのみ終了する
END-IF > ここで外側のIFが終了する

  • — 危険なスタイル: ピリオドによる終了 —
  • ここでピリオドを打つと、内側・外側の両方のIFが
  • 同時に終了してしまい、意図しないバグの元となる。

IF W-A = W-B
IF W-C = 2
MOVE 1 TO W-D. > ここにピリオドがあると全てのIFが閉じる

STOP RUN.

応用・注意点:現場でのバグ回避

現場で最も恐ろしいのは、修正時に「ピリオドをうっかり消し忘れる」あるいは「余計な場所にピリオドを追加してしまう」ことです。特に、ELSE句が続くコードでピリオドを誤用すると、ロジックが完全に崩壊します。

回避策のポイント:
1. 新規作成するプログラムでは、必ずEND-IFを使用する。
2. 既存の古いソースを改修する際は、その周辺にピリオドがないか細心の注意を払う。
3. 万が一、ピリオドで終了している古いロジックを改修する場合、可能であればEND-IF形式にリファクタリングする。

ピリオドは文の区切りとして便利に見えますが、プログラムの「構造」を破壊する可能性があることを常に意識してください。明示的なEND-IFの習慣が、あなたのコードをバグから守る一番の防衛策となります。

コメント

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