[COBOLのはじめ方] Part18: COPY文とコードの再利用

はじめに

COBOLプログラミングを進めていくと、同じようなデータ定義や処理手順を複数のプログラムで使いたい場面が出てきます。そんな時に大活躍するのが COPY文です!

COPY文は、別のファイル(コピーブック または 原始文ライブラリ要素 と呼ばれます)に書かれたCOBOLのコードを、指定した場所に取り込むための命令です。これにより、コードの再利用性が格段に向上し、開発や保守の効率が大幅にアップします。

このステップでは、COPY文の基本的な使い方から、そのメリット、そして便利な REPLACING句について学んでいきましょう!

COPY文の基本的な使い方

COPY文の基本的な構文は非常にシンプルです。

COPY コピーブック名.

ここで、「コピーブック名」には、取り込みたいコードが書かれている外部ファイルの名前を指定します。このファイルは通常、.cpy.cob などの拡張子を持ちます(環境によって異なります)。

COPY文は、主に以下のDIVISIONで使用されます。

  • DATA DIVISION: レコードレイアウトやデータ項目定義など、共通のデータ構造を複数のプログラムで共有する場合によく使われます。
  • PROCEDURE DIVISION: 共通のサブルーチンや処理ロジック(例えば、エラー処理や日付計算など)を部品化して再利用する場合に使われます。

コンパイル時、COBOLコンパイラは COPY文を見つけると、指定されたコピーブックの内容をその場所に展開してから、プログラム全体のコンパイルを行います。まるで、その場にコードが直接書かれているかのように扱われます。

コピーブックの場所

コンパイラがコピーブックを見つけられるように、ファイルの置き場所を指定する必要があります。GnuCOBOLなどの環境では、環境変数 COBCPY を設定したり、コンパイルオプション (-I オプションなど) でパスを指定したりします。

COPY文のメリット

COPY文を使うことには、多くのメリットがあります。

メリット説明
再利用性の向上共通のデータ定義や処理ロジックを一度だけ作成し、多くのプログラムで使い回すことができます。これにより、開発工数を削減できます。
保守性の向上共通部分に修正が必要になった場合、コピーブックを一つ修正するだけで、それを利用している全てのプログラムに修正内容が反映されます。修正漏れを防ぎ、保守作業が効率化されます。
標準化の促進プロジェクト内で使用するデータ形式や、特定の処理手順をコピーブックとして提供することで、コーディングスタイルの統一や標準化を図ることができます。
可読性の向上複雑なデータ定義や定型的な処理ロジックをコピーブックにまとめることで、プログラム本体は主要な処理の流れに集中でき、コードがスッキリとして読みやすくなります。

具体的な使用例

ここでは、DATA DIVISION でレコード定義を共有する例を見てみましょう。

1. コピーブックの作成 (例: MYREC.cpy)

まず、共通で使いたいレコード定義を記述したコピーブックファイルを作成します。

*> コピーブック: MYREC.cpy 01 MY-RECORD. 05 MY-KEY PIC 9(05). 05 MY-NAME PIC X(20). 05 MY-VALUE PIC S9(07)V99 COMP-3. 05 MY-TIMESTAMP PIC X(26). *> 日時情報など

2. メインプログラムでの利用

次に、このコピーブックをメインプログラムの WORKING-STORAGE SECTION などで COPY文を使って取り込みます。

 IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-PROG. DATA DIVISION. WORKING-STORAGE SECTION.
*---------------------------------------
* レコード定義をコピーブックから取り込む
*--------------------------------------- COPY MYREC.
*--------------------------------------- 01 WK-WORK-AREA. 05 WK-COUNT PIC 9(03) VALUE 0. PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY 'プログラム開始'.
* コピーブックで定義したデータ項目を使用 MOVE 10001 TO MY-KEY OF MY-RECORD. MOVE 'テスト顧客名' TO MY-NAME OF MY-RECORD. MOVE +12345.67 TO MY-VALUE OF MY-RECORD. MOVE FUNCTION CURRENT-DATE TO MY-TIMESTAMP OF MY-RECORD. DISPLAY 'キー : ' MY-KEY OF MY-RECORD. DISPLAY '名前 : ' MY-NAME OF MY-RECORD. DISPLAY '値  : ' MY-VALUE OF MY-RECORD. DISPLAY 'タイムスタンプ: ' MY-TIMESTAMP OF MY-RECORD. STOP RUN.
* --- ここに他の処理が続く ---

このように COPY MYREC. と記述するだけで、MYREC.cpy ファイルの内容がその場に展開され、MY-RECORD などのデータ項目がプログラム内で使えるようになります。

REPLACING句による置換

COPY文には、コピーブックの内容の一部を置換しながら取り込む REPLACING句という便利な機能があります。

構文は以下のようになります。

COPY コピーブック名 REPLACING ==置換対象文字列1== BY ==置換後文字列1== ==置換対象文字列2== BY ==置換後文字列2== ... .
  • ==置換対象文字列==: コピーブック内で置換したい部分文字列を指定します。区切り文字 == は他の記号 (::++ など) でも構いませんが、コード内で使われていない記号を選ぶ必要があります。
  • ==置換後文字列==: 置換対象文字列を置き換える新しい文字列を指定します。

使用例:

先ほどのコピーブック MYREC.cpy を使い、データ項目名を少し変えて利用したい場合を考えます。

 WORKING-STORAGE SECTION.
*---------------------------------------------------------
* コピーブック MYREC を利用し、特定の文字列を置換する
*--------------------------------------------------------- COPY MYREC REPLACING ==MY-RECORD== BY ==CUSTOMER-DATA== ==MY-KEY== BY ==CUST-ID== ==MY-NAME== BY ==CUST-NAME==.
*---------------------------------------------------------
* 上記のCOPY文は、コンパイル時に以下のように展開されるイメージ
*
* 01 CUSTOMER-DATA. *> MY-RECORD が CUSTOMER-DATA に置換
* 05 CUST-ID PIC 9(05). *> MY-KEY が CUST-ID に置換
* 05 CUST-NAME PIC X(20). *> MY-NAME が CUST-NAME に置換
* 05 MY-VALUE PIC S9(07)V99 COMP-3. *> 置換指定なし
* 05 MY-TIMESTAMP PIC X(26). *> 置換指定なし
*--------------------------------------------------------- PROCEDURE DIVISION. MOVE 54321 TO CUST-ID OF CUSTOMER-DATA. MOVE '別の顧客' TO CUST-NAME OF CUSTOMER-DATA. MOVE +987.65 TO MY-VALUE OF CUSTOMER-DATA. *> 置換されなかった項目 DISPLAY '顧客ID: ' CUST-ID OF CUSTOMER-DATA. DISPLAY '顧客名: ' CUST-NAME OF CUSTOMER-DATA. DISPLAY '値  : ' MY-VALUE OF CUSTOMER-DATA. ...

REPLACING句を使うことで、一つのコピーブックを元にして、少しだけ異なるバリエーションのコードを簡単に生成できます。ただし、多用しすぎると、元のコピーブックの内容が分かりにくくなる可能性もあるため、注意が必要です。

注意点とベストプラクティス

  • コピーブックの管理: プロジェクト内で使用するコピーブックは、バージョン管理システムなどで適切に管理し、誰がいつ、どのような変更を加えたかを追跡できるようにしましょう。
  • 命名規則: コピーブックの名前や、コピーブック内で定義されるデータ項目名には、一貫性のある命名規則を適用することが推奨されます。これにより、どのプログラムでどのコピーブックが使われているか、データ項目が何を表すかが分かりやすくなります。
  • 依存関係の明確化: あるコピーブックが別のコピーブックを COPY する(ネストする)ことも可能ですが、依存関係が複雑になりすぎないように注意が必要です。
  • 循環コピーの禁止: コピーブックAがコピーブックBを COPY し、コピーブックBがコピーブックAを COPY するような循環参照は、コンパイルエラーの原因となります。
  • REPLACING句のバランス: REPLACING句は便利ですが、乱用するとコードの可読性を損なう可能性があります。置換が多くなりすぎる場合は、コピーブックを分けるなどの設計見直しを検討しましょう。

まとめ

COPY文は、COBOLにおけるコード再利用の基本的な仕組みです。

  • 共通のデータ定義や処理ロジックをコピーブックにまとめる。
  • プログラム内で COPY文を使ってそれらを取り込む。
  • 必要に応じて REPLACING句で部分的な置換を行う。

これらのテクニックを習得することで、より効率的で、保守しやすく、標準化されたCOBOLプログラムを作成できるようになります。ぜひ積極的に活用してみてください!

次は、いよいよ実務的な処理として、「Step 6: 帳票出力とフォーマット制御」に進みましょう!

参考情報

より詳細な情報や他の使い方については、以下のドキュメントなどを参照してください。

  • GnuCOBOL Programmer’s Guide: GnuCOBOLの公式マニュアルには、COPY文に関する詳細な説明が含まれています。(※最新の公式ドキュメントをご確認ください)
  • COBOL入門サイトなど: 様々な入門サイトでCOPY文の使い方が解説されています。 (例: チュートリアルポイントのCOBOL解説など。URLは検索してご確認ください。)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です