【COBOL学習|豆知識】熟練プログラマが教える「MOVE CORRESPONDING」の意外な落とし穴と正しい作法

導入:なぜ今さらMOVE CORRESPONDINGなのか

COBOL開発において、複数の項目を一括で転記できる「MOVE CORRESPONDING(以下、MOVE CORR)」は非常に便利な命令です。しかし、その「便利さ」の裏には、仕様を正しく理解していないと発生する「データが転記されない」「期待した値が入らない」といったバグが潜んでいます。今回は、この命令が持つ「暗黙のフィルタリング機能」について解説します。なぜこの挙動を知ることが重要かと言えば、構造変更が発生した際、コンパイルエラーにならずに「データが欠落する」という、最も恐ろしいサイレントバグを回避するためです。

基礎知識:MOVE CORRの仕組み

MOVE CORRは、指定した二つの集団項目の下位にある項目同士を比較し、名前(修飾名)が完全に一致するものだけを転記します。
重要なのは、単に名前が同じであれば良いというわけではない点です。参考本文にある通り、以下の条件を満たす必要があります。
1. 両方とも基本項目であること。
2. データ型が転記可能(互換性がある)であること。
もし、一方が集団項目で、もう一方が基本項目である場合、その項目は「対象外」として無視されます。COBOLコンパイラはこれをエラーと見なさないため、開発者が意図せず転記漏れを起こしやすいポイントとなります。

実装・解決策:安全な運用ルール

現場での鉄則は「MOVE CORRに過度な期待をしない」ことです。構造が複雑な場合は、個別にMOVE文を記述する方が保守性は高まります。どうしてもMOVE CORRを使う場合は、以下のサンプルコードのように、データ定義の段階で階層を揃え、意図しない型変換が起きないよう配慮することが肝要です。

サンプルプログラム

以下のコードは、MOVE CORRがどのように動作するかを示した例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-CORR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 GROUP-A.
05 NAME-DATA PIC X(10) VALUE ‘COBOL’.
05 NUM-DATA PIC 9(05) VALUE 12345.
05 SUB-GROUP.
05 ID-CODE PIC 9(03) VALUE 999.

01 GROUP-B.
05 NAME-DATA PIC X(10).
05 NUM-DATA PIC 9(05).
05 SUB-GROUP PIC X(03). > ここは基本項目(X)として定義

PROCEDURE DIVISION.
> MOVE CORRを実行
MOVE CORRESPONDING GROUP-A TO GROUP-B.

> 解説:
> NAME-DATAとNUM-DATAは基本項目同士で名前が一致するため転記されます。
> しかし、SUB-GROUPはGROUP-Aでは集団項目、GROUP-Bでは基本項目であるため、
> MOVE CORRの対象外となり転記されません。

DISPLAY ‘NAME-DATA: ‘ NAME-DATA OF GROUP-B.
DISPLAY ‘NUM-DATA: ‘ NUM-DATA OF GROUP-B.
DISPLAY ‘SUB-GROUP: ‘ SUB-GROUP OF GROUP-B. > ここは空(初期値)のままです

STOP RUN.

応用・注意点:現場で陥りやすいバグの回避策

現場で最も注意すべきは「後からの仕様変更」です。既存の集団項目に新しい項目を追加した際、MOVE CORRを使っていると、意図せずその新しい項目も転記対象に含まれてしまいます。
回避策として、以下のポイントを意識してください。
名前の重複を避ける:異なる意味を持つ項目には、必ず別々の名前を付け、CORRESPONDINGによる事故を物理的に防ぐ。
デバッグ時の確認:MOVE CORR使用箇所に変更を加えた場合は、必ずコンパイルリストの「CORRESPONDINGステートメントの展開」を確認する癖をつける。
「魔法のような命令」ほど、仕様を正確に把握して慎重に使うことが、ベテラン技術者の作法です。

コメント

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