COBOLの定数管理とCOPY句(コピー句)を完全解説!保守効率を高めるテクニック
生徒
「プログラムの中で、消費税率の10パーセントを色々な場所に書いているのですが、もし税率が変わったら全部書き直さないといけないんですか?」
先生
「その通りです。あちこちに直接数字を書くと、修正がとても大変になります。そこで使うのが定数管理とCOPY句(コピー句)という仕組みです。」
生徒
「コピー句を使うと、一箇所直すだけで全部に反映されるんですか?」
先生
「そうです。メンテナンスが劇的に楽になりますよ。具体的な使い方を詳しく見ていきましょう!」
1. 定数管理とは?なぜ直接数字を書いてはいけないのか
プログラミングにおいて、数値や文字をプログラムの中に直接書き込むことをマジックナンバーと呼びます。例えば、消費税率の「0.1」や、一日の時間である「24」などをそのままプログラムのあちこちに書くことです。これは初心者の方が最初についやってしまう書き方ですが、プロの世界では避けるべきこととされています。
なぜ直接書いてはいけないのでしょうか。理由は大きく二つあります。一つ目は、その数字が何を表しているのか分かりにくいからです。ただの「1000」という数字が、最大入力を表すのか、送料を表すのか、後から見た人が判断できません。二つ目は、変更に弱いことです。もし消費税率が10パーセントから15パーセントに上がった場合、何百箇所もある「0.1」を全て探し出して、間違いなく書き換えなければなりません。これは非常にリスクが高く、作業時間も膨大になります。
定数管理とは、こうした「変わる可能性のある決まった値」に「名前(ラベル)」をつけて、プログラムの最初の方で一括して定義しておく手法のことです。名前をつけることで、プログラムの意味が通じやすくなり、変更が必要な際もその定義箇所を一箇所修正するだけで、プログラム全体に反映させることができます。
2. 定数定義の具体的な書き方:VALUE句の活用
COBOLで定数を定義するには、データ部(DATA DIVISION)の作業場所節(WORKING-STORAGE SECTION)を使います。ここで、変数と同じように名前を付け、その後に VALUE(バリュー)句を使って値を指定します。一度決めたらプログラムの途中で変えない値のことを定数と呼びます。
例えば、消費税率を定義する場合は次のように書きます。名前を付けるときは、それが定数であることが一目でわかるように、「CONST-」や「C-」といった接頭辞をつけるのが一般的なコーディング規約です。これにより、計算式の中で使われているのが「途中で中身が変わる箱(変数)」なのか「ずっと変わらない決まり(定数)」なのかがすぐに分かります。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CONST-TAX-RATE PIC 9V99 VALUE 0.10.
01 CONST-MAX-COUNT PIC 9(03) VALUE 500.
PROCEDURE DIVISION.
COMPUTE SALES-TAX = PRICE * CONST-TAX-RATE.
このように書けば、計算式が PRICE * 0.10 ではなく PRICE * CONST-TAX-RATE となり、英語の文章を読むように「価格に税率を掛ける」という意図がはっきりと伝わります。
3. COPY句(コピー句)の基本概念
定数管理を一歩進めたのが COPY句(コピー句) です。大規模なシステム開発では、一つのプログラムだけでなく、何十、何百というプログラムが同時に動いています。消費税率のような共通の決まりごとは、全てのプログラムで同じ値を使わなければなりません。しかし、それぞれのプログラムに同じ定数定義を書いて回ると、またしても修正漏れのリスクが出てきます。
そこで、「共通の定義だけを別のファイル(コピーライブラリ)に保存しておき、必要なプログラムがそれを読み込む」という仕組みを使います。これがCOPY句です。パソコンに詳しくない方に例えると、料理のレシピ本(プログラム)の中に、毎回使う「基本のダシの作り方」を直接書くのではなく、「基本のダシについては別紙の1ページ目を参照」と書いておくようなものです。別紙の内容を書き換えれば、その別紙を参照している全ての料理の味が一度に変わるというわけです。
4. COPY句の具体的な記述方法
COPY句を使う際は、プログラムの中に COPY というキーワードと、読み込みたいファイルの名前を書きます。COBOLのコンパイラ(プログラムをコンピューターがわかる言葉に翻訳するソフト)は、このCOPYという文字を見つけると、指定されたファイルの中身をその場所にガチャンとはめ込んでくれます。
以下は、共通定数ファイルを読み込むプログラムの例です。コピーファイルの名前を「COMMON-CONST」とした場合の書き方を見てみましょう。
DATA DIVISION.
WORKING-STORAGE SECTION.
* 共通定数定義ファイルをここで読み込む
COPY COMMON-CONST.
PROCEDURE DIVISION.
DISPLAY CONST-COMPANY-NAME.
この一行だけで、別のファイルに書かれた膨大な定数設定が、まるでそこに最初から書いてあったかのように使えます。初心者の方が注意する点は、COPY句の最後にも必ずピリオド . を忘れないことです。
5. コピーライブラリ(登録集ファイル)の作り方
COPY句で読み込まれる側のファイルは、通常「コピーライブラリ」や「登録集」と呼ばれます。このファイルには、通常のプログラムの全体を書くのではなく、データ定義の部分だけを抜き出して記述します。
例えば、会社名やシステム全体で使う最大値をまとめたコピーファイルの内容は、以下のようになります。この内容は、多くのプログラムで使い回されることを前提に、誰が見ても分かりやすい名前にすることが重要です。名前の付け方がバラバラだと、せっかくの共通管理が台無しになってしまうからです。
* COMMON-CONST の中身
01 CONST-SYSTEM-INFO.
05 CONST-COMPANY-NAME PIC X(20) VALUE "ABC商事株式会社".
05 CONST-VERSION PIC X(05) VALUE "V1.02".
05 CONST-RETRY-MAX PIC 9(01) VALUE 3.
このようにグループ化(01レベルの下に05レベルなどを置く)しておくことで、情報の整理整頓がさらに進みます。パソコンのフォルダの中にファイルを整理するような感覚ですね。
6. 条件名(88番項目)との組み合わせ
定数管理と非常に相性が良いのが、88番項目(条件名) です。これは、「特定のデータがこの値のときは、こういう名前で呼びます」という約束をする仕組みです。定数と条件名を組み合わせることで、プログラムの可読性(読みやすさ)は最高潮に達します。
例えば、ステータスが「1」なら正常、「9」なら異常終了、といったルールを定数と条件名で管理してみましょう。これをコピー句に入れておけば、どのプログラムでも同じ「正常」「異常」の判定基準が使えます。数字の1や9を直接判定するよりも、言葉で判定するほうが間違いがありません。
01 STATUS-CODE PIC X(01).
88 STATUS-NORMAL VALUE "1".
88 STATUS-ERROR VALUE "9".
* 使い方
IF STATUS-NORMAL THEN
DISPLAY "処理は正常に完了しました"
END-IF.
7. COPY句の活用:レコード形式の共通化
定数だけでなく、ファイルやデータベースのデータの並び順(レコードレイアウト)もCOPY句で管理します。これは非常に重要です。システムの中では、あるプログラムがデータを作成し、別のプログラムがそのデータを読み取ります。もし、データの並び順の定義がプログラムごとにバラバラだったら、正しくデータを読み取ることができず、システムは壊れてしまいます。
そのため、データの設計図となるレイアウトを一つのコピーファイルにまとめ、全てのプログラムが同じ設計図をコピーして使うように徹底します。これをレコード形式の共通化と呼びます。一つの場所を修正すれば、読み手と書き手の両方のプログラムに修正が反映されるため、食い違いが起こらなくなります。
8. 修正の影響範囲を最小限にする「疎結合」の考え方
定数管理やCOPY句を適切に使う目的は、プログラム同士の結びつきを整理し、修正の影響範囲をはっきりさせることにあります。これを専門用語で「疎結合(そけつごう)」を目指すと言います。パソコンを触ったことがない方でも、電化製品のコンセントをイメージすれば分かります。どのメーカーの掃除機でも同じコンセント(共通規格)に差せば動くように、プログラムも共通の定数や形式を使うことで、一部を変えても全体が壊れないように作るのが理想です。
直接的な数値を減らし、COPY句を通じて情報をやり取りすることで、システム全体が柔軟になります。新しい税率、新しい取引先、新しい年度への切り替えなど、将来必ずやってくる変化に対して、慌てずに対応できる「強いシステム」を作るための基礎が、この定数管理なのです。
9. コーディング規約で決めておくべき定数のルール
自由奔放に定数を作ってしまうと、かえって混乱を招くことがあります。そのため、チームで開発をするときは、あらかじめルール(コーディング規約)を決めておきます。未経験の方が現場に入ったときは、まずこのルールを確認することが大切です。
- プレフィックス(接頭辞)を決める: 定数の名前の先頭には
CONST-をつける、などのルールです。 - 大文字で統一する: COBOLは基本的に大文字で書きますが、名前の付け方も統一します。
- コメントを添える: その定数が何を意味するのか、日本語で説明を必ず書きます。
- 定義する場所を固定する: どこに定数を書くのか、どのコピーファイルを読み込むのかを統一します。
これらのルールを守ることで、誰が書いても同じ品質のプログラムが出来上がります。初心者のうちは面倒に感じるかもしれませんが、大規模なプログラムを管理するためには欠かせないマナーです。
10. COPY句使用時のコンパイルエラーとその対策
最後に、COPY句を使う際によくある失敗についてお話しします。一番多いのは「指定したコピーファイルが見つからない」というエラーです。これは、プログラムを書いたファイルとは別の場所にコピーファイルを保存してしまったり、ファイル名の綴りを間違えたりしたときに起こります。パソコンの操作では、ファイルの保存場所(パス)を正しく指定することが非常に重要です。
また、コピーファイルの中で定義した名前が、プログラム内の他の名前と重複してしまう「二重定義」というエラーもよくあります。これを防ぐために、定数名や変数名にはプログラムごとに固有の番号や名前を混ぜるなどの工夫が必要です。コンパイルエラーが出ても焦らず、コピー句が正しく展開された後の姿を想像して、どこに矛盾があるかを探してみましょう。デバッグ(間違い探し)の力も、こうした構造を理解することで養われていきます。