COBOL共通部品(サブルーチン)標準化ガイド!初心者のための設計手順と呼び出し方
生徒
「COBOLで何度も同じ計算プログラムを書くのが大変なのですが、何か良い方法はありますか?」
先生
「それなら共通部品(サブルーチン)を作るのが一番です。一度作れば、どのプログラムからでも呼び出して使い回すことができますよ。」
生徒
「共通部品をバラバラに作ると後で困りそうですね。何か決まった作り方の手順やルールはあるのでしょうか?」
先生
「あります。それを標準化手順と呼びます。初心者の方にも分かりやすく、標準化の基本とサブルーチンの作り方を解説しましょう!」
1. 共通部品(サブルーチン)とは?料理のレシピに例えて解説
プログラミングの世界には、共通部品(きょうつうぶひん)やサブルーチンという言葉があります。これは、複数の場所で何度も使う便利な処理を、一つの独立したプログラムとして切り出したものです。パソコンを触ったことがない方でも、料理の工程をイメージすればすぐに理解できます。
例えば、カレー、肉じゃが、シチューを作るとします。これら全ての料理には「野菜の皮をむいて、一口大に切る」という共通の作業が含まれています。毎回それぞれのレシピに「皮のむき方」を詳しく書くのは大変ですよね。そこで「野菜の下準備」という別のレシピを一つ作っておきます。各料理のレシピには「ここで野菜の下準備レシピを見てください」と一行書くだけで済むようになります。これが共通部品の考え方です。
COBOLのプログラムでも、消費税の計算や日付の形式チェックなど、どんなプログラムでも使う処理を共通部品にすることで、開発効率を劇的に向上させることができます。また、一つの部品を修正するだけで、それを使っている全てのプログラムに修正が反映されるため、メンテナンスが非常に楽になります。
2. 標準化手順が必要な理由とメリット
共通部品は、ただ作れば良いというわけではありません。「標準化手順(ひょうじゅんかてじゅん)」という決まったルールに従って作ることが不可欠です。もし、開発者ごとにバラバラな作り方をしていたらどうなるでしょうか。ある人は消費税計算の部品に「金額」を渡し、別の人は「個数」も一緒に渡さないと動かないように作るかもしれません。これでは、他の人がその部品を使おうとしたときに混乱してしまいます。
標準化とは、いわば「コンセントの形を揃える」作業です。日本中のコンセントが同じ形だからこそ、私たちはどの家でも電化製品を使うことができます。プログラムも同じで、データの渡し方、名前の付け方、エラーが起きた時の報告方法などを統一することで、誰でも安心して部品を組み合わせて使えるようになります。これを専門用語で「インターフェースの統一」と言います。
標準化された共通部品が増えるほど、プログラム本体は短くシンプルになります。未経験の方にとって、何千行もあるプログラムを読むのは苦痛ですが、中身が整理され、各部品が標準的な手順で呼び出されていれば、全体の流れを把握するのがずっと簡単になります。品質を安定させ、ミスを減らすためにも、標準化は非常に重要なのです。
3. サブルーチンの呼び出し方と基本の書き方
COBOLで共通部品(サブルーチン)を呼び出すには、CALL文という特別な命令を使います。この命令は、今実行しているプログラムを一時的に止めて、指定した別のプログラム(サブルーチン)に処理を任せるという意味を持っています。処理が終わると、元のプログラムの続きに戻ってきます。
サブルーチンを呼び出す際には、データをやり取りするための橋渡しが必要です。この橋渡しのことを「引数(ひきすう)」と呼びます。呼び出す側(メインプログラム)はUSINGという言葉を使ってデータを渡し、呼び出される側(サブルーチン)もUSINGを使ってそのデータを受け取ります。この時のデータの並び順や形式が一致していなければ、プログラムは正しく動きません。
以下のコード例では、メインプログラムから税抜き価格を渡し、サブルーチンが消費税を計算して結果を戻すというシンプルな流れを示しています。初心者の方でも、どのようにデータが行き来しているかに注目して見てみましょう。
* メインプログラム側の呼び出し例
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(08) VALUE 1000.
01 TAX-AMOUNT PIC 9(08) VALUE 0.
PROCEDURE DIVISION.
* 消費税計算部品を呼び出す
CALL "TAX-CALC" USING PRICE TAX-AMOUNT.
DISPLAY "税込み結果: " TAX-AMOUNT.
STOP RUN.
4. 呼び出される側のサブルーチン(LINKAGE SECTION)の構造
次に、呼び出される側のプログラム(サブルーチン)がどのようになっているかを見てみましょう。ここで最も大切なのがLINKAGE SECTION(リンケージセクション)という場所です。これは、他のプログラムから渡されてきたデータを受け取るための専用の保管場所です。
サブルーチン側では、自分自身の中で使う変数だけでなく、外から来るデータをこのセクションに定義します。また、プログラムの開始地点であるPROCEDURE DIVISIONの横に、受け取るデータの名前を並べます。これが、先ほどのメインプログラムのCALL ... USINGと対になる仕組みです。この構造を正しく書くことが、標準化手順の第一歩となります。
難しい単語が出てきましたが、要するに「外から届いた荷物を置くための玄関」がリンケージセクションだと考えてください。玄関に届いた荷物を家の中で加工して、また玄関に置いておく。そうすることで、呼び出した側が結果を受け取れるようになるのです。
* 呼び出される側のサブルーチン例
IDENTIFICATION DIVISION.
PROGRAM-ID. TAX-CALC.
DATA DIVISION.
LINKAGE SECTION.
01 L-PRICE PIC 9(08).
01 L-TAX-AMOUNT PIC 9(08).
PROCEDURE DIVISION USING L-PRICE L-TAX-AMOUNT.
* 消費税10パーセントを計算して結果を戻す
COMPUTE L-TAX-AMOUNT = L-PRICE * 1.10.
EXIT PROGRAM.
5. 共通部品を設計する際の名前付けルール
標準化手順の中で、意外と重要なのが「名前の付け方(命名規則)」です。プログラムの名前を見ただけで、それが何をする部品なのか、誰が作ったのかが一目で分かるようにしなければなりません。例えば、日付を変換する部品ならDATE-CONV、文字を検索する部品ならSTR-SEARCHといった名前を付けます。適当にPROG-01のような名前を付けると、後で誰も中身が分からなくなってしまいます。
また、部品の中で使うデータの名前にもルールを設けます。サブルーチン内で使う変数には、頭に「L-(リンケージの略)」や「W-(ワーキングストレージの略)」といった接頭辞(せっとうじ)を付けるのが一般的です。これにより、今使っているデータが「外から渡されたもの」なのか「そのプログラムの中だけで使っているもの」なのかが、ひと目で判別できるようになります。
このように名前を整理することは、大規模なシステム開発では非常に重要です。何百人という開発者が関わるプロジェクトでは、自分一人しか分からない名前を使うことは許されません。誰にでも通じる「共通言語」として名前を付けることが、プログラムの品質を支える土台となります。
6. エラー情報の返し方を統一する標準ルール
共通部品が常に正しく処理を終えるとは限りません。例えば、数字を計算する部品に文字が渡されてしまったり、存在しないデータを検索しようとしたりした場合、部品は「エラーが起きました」と呼び出し元に伝えなければなりません。このエラーの伝え方を統一することも、標準化手順の肝となる部分です。
一般的には、呼び出し時のデータの最後に「リターンコード」や「エラーフラグ」と呼ばれる項目を追加します。例えば、「0」なら正常終了、「1」なら警告、「9」なら重大なエラーといった具合に数字の意味を決めておきます。呼び出し側のプログラムは、部品から戻ってきた後に必ずこの数字をチェックし、次の行動を決めます。エラーが起きたのに無視して処理を続けると、取り返しのつかないデータの破壊につながる恐れがあるからです。
これを学校の連絡帳に例えると、先生が宿題をチェックして、問題なければ花丸、修正が必要なら三角形を書くようなものです。生徒(メインプログラム)はその印を見て、次の宿題に進むかやり直すかを判断します。この印のルールがクラス全員で統一されているからこそ、スムーズに授業が進むのです。
* エラーチェックを行うメインプログラムの例
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IN-DATA PIC X(10) VALUE "ABC12345".
01 ERR-CODE PIC 9(01) VALUE 0.
PROCEDURE DIVISION.
CALL "DATA-CHECK-SUB" USING IN-DATA ERR-CODE.
IF ERR-CODE NOT = 0
DISPLAY "エラーが発生しました。コード: " ERR-CODE
ELSE
DISPLAY "データは正常です。"
END-IF.
STOP RUN.
7. データの初期化と終了処理の定型化
サブルーチンを繰り返し呼び出す場合、注意しなければならないのが「データの消し忘れ」です。プログラムの中に前の処理で使った値が残っていると、次の計算がおかしくなってしまうことがあります。これを防ぐために、サブルーチンの最初で必ずデータを真っさらな状態にする「初期化(しょきか)」を行うのが標準的な手順です。
初期化にはINITIALIZE(イニシャライズ)文を使います。この命令一行で、指定した項目の中身を数字ならゼロに、文字なら空白(スペース)にリセットしてくれます。自分で一つずつ「ここをゼロにする」と書くよりも間違いがなく、ソースコードもスッキリします。初心者のうちは、この初期化を忘れがちですので、必ず「部品の最初は初期化から」という習慣をつけましょう。
また、処理が終わったときの終了方法も決まっています。メインプログラムはSTOP RUNでコンピュータに「全ての作業が終わりました」と告げますが、サブルーチンの場合はEXIT PROGRAMを使います。これは「今の部品の仕事は終わったので、呼び出し元に戻ります」という意味です。これを間違えると、プログラムが予期せぬ場所で止まってしまうので注意が必要です。
8. 実行結果の確認とデバッグの進め方
共通部品を作ったら、それが本当に正しく動くかテストしなければなりません。部品単体で動かすことを「単体テスト」と呼びます。標準化された手順で作られた部品であれば、テスト用の小さなプログラムを作って簡単に動作確認ができます。もしエラーが出た場合は、どこに原因があるかを探す「デバッグ」という作業を行います。
COBOLではDISPLAY文を使って、プログラムの途中で変数の値を画面に表示させることがよくあります。「今、この部品にはどんなデータが届いているのか」「計算した後の値はどうなっているか」を逐一確認することで、間違いの箇所を特定できます。実行結果が期待通りであれば、その部品は完成です。一度信頼できる部品が出来上がれば、それはあなたの強力な武器になります。
以下の実行結果は、データチェック部品を呼び出し、わざとエラーになるデータを入れた場合の表示例です。このように結果がハッキリ見えるように作ることも、使いやすい共通部品の条件です。パソコン初心者の方も、まずは小さな部品を作って動かす喜びを体験してみてください。
START DATA-CHECK-SUB
INPUT-DATA: ABC12345
RESULT-CODE: 1 (INVALID DATA FORMAT)
END MAIN-PROG
9. 共通部品のドキュメント作成と資産管理
せっかく便利な共通部品を作っても、その使い方が他の人に伝わらなければ宝の持ち腐れです。標準化手順の最後には、必ず「この部品はどうやって使うのか」を記した説明書(ドキュメント)を作成します。どのようなデータを渡せばいいのか、どのような結果が戻ってくるのか、エラーコードの意味は何なのか、といった情報を整理して残しておきます。これを専門用語で「仕様書(しようしょ)」と呼びます。
また、作成した部品をシステム全体の「資産(しさん)」として管理することも大切です。誰でも見られる共有フォルダや専用の管理ツールに登録しておくことで、他の開発者が「あ、この処理なら既に誰かが部品を作ってくれているな」と気づくことができます。同じような部品を二重に作る無駄を省くことが、プロジェクト全体の成功につながります。
プログラミング未経験の方は、プログラムを書くことだけが仕事だと思いがちですが、こうした「整理・記録・共有」の作業こそが、プロの現場では高く評価されます。美しいコードを書き、それを誰でも使える形にして残す。これこそが、真の共通部品の標準化手順なのです。