COBOLの可読性・メンテナンス性向上技法!初心者でも読みやすいCLIツールと運用スクリプトの書き方
生徒
「COBOLのプログラムや自動化スクリプトを作ってみたのですが、文字ばかりで後から見返したときにどこに何が書いてあるのか分からなくなってしまいました。」
先生
「それは大切なことに気づきましたね。プログラムは動くだけでなく、人間が見たときに理解しやすい可読性と、後から修正や機能追加がしやすいメンテナンス性を高めることが重要です。」
生徒
「読みやすさと修正のしやすさですね。パソコンを触ったことがない初心者の私でも、工夫次第で綺麗なコードが書けるようになりますか?」
先生
「もちろんですよ。ちょっとした隙間の空け方や名前の付け方のルールを覚えるだけで、見違えるほど綺麗なプログラムになります。具体的なコツを一緒に見ていきましょう!」
1. 可読性とメンテナンス性とは何か
プログラミングの学習を始めると、まずは正しく動くプログラムを作ることに必死になりがちです。しかし、業務で使われるシステム開発の現場では、動くことと同じくらい大切にされている考え方があります。それが可読性とメンテナンス性です。可読性とは、プログラムの文字(コード)がどれだけスッキリしていて、他の人が見たときに見やすいか、理解しやすいかという度合いのことです。メンテナンス性とは、後からプログラムの一部を書き換えたり、新しく機能を追加したり、不具合を直したりするときに、どれだけ作業が簡単で安全に行えるかという性質のことです。
パソコンの操作経験がない方に向けて簡単な例えでお話しすると、書類が山積みにされた散らかった机と、ジャンルごとにファイリングされた綺麗な机の違いのようなものです。散らかった机では、目的の書類を探すだけで時間がかかりますし、書類を抜き取ったときに別の書類が崩れてしまうかもしれません。綺麗な机であれば、誰が来てもすぐに書類を見つけられますし、新しい書類の追加も一瞬です。画面の文字だけで命令を出すCLIツールや、それを自動実行する運用スクリプトでも、この整理整頓がとても重要になります。
2. インデントと空白で行間を整える基礎
COBOLの文字を圧倒的に読みやすくする最初のコツは、インデントです。インデントとは、行の先頭にいくつかスペースを空けて、文字の書き出し位置を右側にずらす操作のことです。日本語の文章を書くときに、段落の先頭を一文字下げるのに似ています。プログラムの中で、一連のまとまった処理や、条件によって分かれる処理の段落を少し右に下げることで、視覚的に処理の構造が把握できるようになります。
COBOLには歴史的な古い決まりごととして、文字を書く列の位置が厳格に定められていますが、手順を書く領域の中では自由にスペースを入れて見栄えを整えることができます。行と行の間にあえて何も書かない空行を挟むだけでも、文章の塊がはっきりして読みやすくなります。ぎゅうぎゅうに詰め込まれた文字の壁をなくすことが、初心者を脱出する第一歩です。
3. 意味が伝わる名前付けとデータ定義の整理
プログラムの中では、文字や数字などの各種データを一時的に保管しておくための、名前のついた箱をたくさん用意します。この箱のことを変数と呼び、箱を準備する行為をデータ定義と言います。この箱に付ける名前の選び方一つで、プログラムの読みやすさは大きく変わります。例えば、中身が合計金額なのに「A」や「X」といった適当な一文字の名前を付けてしまうと、後から見たときに何の数字が入っているのかさっぱり分かりません。
COBOLは、他の言語に比べて英語の文章に近い表現ができるように作られているため、名前には「TOTAL-AMOUNT」や「USER-NAME」のように、一目で中身が想像できる英単語を使うのが鉄則です。ハイフンを使って単語を繋ぐことができるのもCOBOLの特徴です。以下は、分かりやすい名前を使ってデータを整理して並べた、最も基本的なデータ定義の見本です。
IDENTIFICATION DIVISION.
PROGRAM-ID. READABLE1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COMPANY-SETTINGS.
05 SYSTEM-VERSION PIC X(5) VALUE "1.0.0".
05 MAX-USER-COUNT PIC 9(4) VALUE 1500.
05 COMPANY-NAME PIC X(20) VALUE "TOKYO SHOP".
PROCEDURE DIVISION.
DISPLAY "システム名: " COMPANY-NAME
DISPLAY "バージョン: " SYSTEM-VERSION
STOP RUN.
このプログラムを実行すると、定義した箱の中から文字が取り出されて、以下のように画面に分かりやすく表示されます。
システム名: TOKYO SHOP
バージョン: 1.0.0
4. 注釈コメントを書き残して未来の自分を助ける
どれだけ綺麗な英語でプログラムを書いても、なぜその処理を行っているのかという理由までは文字から読み取れないことがあります。そこで活用するのがコメント(注釈)です。コメントとは、プログラムの実行には一切影響を与えない、人間が読むためだけのメモ書きのことです。COBOLでは、行の特定の場所(7列目)にアスタリスクの記号を書くことで、その行全体をメモ帳として使うことができます。
コメントには、プログラムの概要や、特殊な計算をしている理由などを日本語で詳しく書いておきます。数ヶ月後の自分がプログラムを修正することになったとき、このメモ書きがあるおかげで、当時の記憶を一瞬で思い出すことができます。未来の自分や、一緒に働く仲間のために、親切な説明書きを残しておく習慣をつけましょう。ただし、「何をしているか」だけでなく「なぜそうしているか」を書くのがメンテナンス性を高める秘訣です。
IDENTIFICATION DIVISION.
PROGRAM-ID. READABLE2.
PROCEDURE DIVISION.
*======================================================*
* クライアントからの要望により、消費税の計算を行う処理
* 税率は端数切り捨てとして計算しています
*======================================================*
DISPLAY "--- 税金計算処理を開始します ---"
DISPLAY "計算が完了しました。"
STOP RUN.
アスタリスクから始まる行は、パソコンが読み飛ばしてくれるため、実行しても画面には処理の文字だけが出てきます。
--- 税金計算処理を開始します ---
計算が完了しました。
5. 長い処理を区切りで分割して部品化するコツ
一つのプログラムの中に、何百行もの命令をダラダラと長く書き連ねてしまうと、全体の流れを把握するのが非常に難しくなります。本の一章が何十ページも改行なしで続いているようなものです。そこで、処理の目的ごとに小さな段落に切り分けて、名前をつけて管理します。この小分けにした処理の塊のことをCOBOLではセクションや段落(パラグラフ)と呼びます。
メインとなる全体の流れを書く場所からは、PERFORMという命令を使って、切り分けた段落の名前を呼び出します。呼び出された段落の処理が終わると、自動的に元の場所に戻ってきて次の命令に進みます。このように処理を部品化しておくことで、不具合が起きたときに「どの部品が壊れているか」を見つけるのが劇的に早くなりますし、部品を別の場所で再利用することもできるようになります。
IDENTIFICATION DIVISION.
PROGRAM-ID. READABLE3.
PROCEDURE DIVISION.
MAIN-ROUTINE.
PERFORM INITIAL-PROCESS
PERFORM DATA-PROCESS
PERFORM FINAL-PROCESS
STOP RUN.
INITIAL-PROCESS.
DISPLAY "[START] 初期化作業を行います。".
DATA-PROCESS.
DISPLAY "[PROCESSING] 主な計算を実行しています。".
FINAL-PROCESS.
DISPLAY "[END] ファイルを閉じて終了します。".
このプログラムを実行すると、上から順番に段落が呼び出され、まるで一つの大きな物語のように綺麗に整理された結果が画面に出力されます。
[START] 初期化作業を行います。
[PROCESSING] 主な計算を実行しています。
[END] ファイルを閉じて終了します。
6. 複雑な条件分岐を分かりやすく整理する記述方法
条件によって処理を細かく枝分かれさせるIF文はとても便利ですが、条件の中にさらに条件が入り組んだ「入れ子構造(ネスト)」になってしまうと、一気に可読性が低下します。右へ右へとインデントが深くなっていき、どの条件がどこで終わっているのかが人間の目で判別できなくなってしまいます。これを防ぐために、COBOLでは条件の終わりを告げるEND-IFを必ずセットで書くように意識します。
また、たくさんの条件を上から順番に確認していきたい場合は、IF文を何個も重ねるのではなく、条件一覧の表を作るように記述できるEVALUATEという命令を使うのがおすすめです。これは他の言語で「スイッチ文」と呼ばれるものに近く、縦に綺麗に条件が並ぶため、後から新しい条件を追加したいときにも、他の部分を壊さずに安全に行を付け足すことができます。
IDENTIFICATION DIVISION.
PROGRAM-ID. READABLE4.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STATUS-CODE PIC X(1) VALUE "B".
PROCEDURE DIVISION.
DISPLAY "会員ランクの判定を行います。"
EVALUATE STATUS-CODE
WHEN "A"
DISPLAY "プレミアム会員:特典が適用されます。"
WHEN "B"
DISPLAY "レギュラー会員:通常特典です。"
WHEN OTHER
DISPLAY "ゲスト会員:登録がありません。"
END-EVALUATE
STOP RUN.
このプログラムは、箱の中身が「B」であることに一致する場所を瞬時に見つけて、その中に書かれているメッセージだけをピンポイントで実行します。
会員ランクの判定を行います。
レギュラー会員:通常特典です。
7. 運用スクリプトの見た目を整えて自動化を楽にする
ここまでは主に対象となるCOBOLのプログラム自体の書き方について解説してきましたが、それらを裏側で自動的に呼び出して実行する役割を持つ運用スクリプトについても、可読性とメンテナンス性の向上策は共通しています。スクリプトファイルを書くときも、ただ命令を並べるだけでなく、今何を実行しているのかを画面に表示する親切な設計を心がけます。
何も文字が表示されないスクリプトだと、動かしたときに本当に処理が進んでいるのか、フリーズして止まっているのかが判別できません。また、プログラムを動かすために必要なファイルが置いてある場所(パス)を、スクリプトのあちこちに直接書き込むのではなく、最初に一箇所に変数の箱として定義しておくことで、将来ファイルの置き場所が引っ越したときにも、先頭の一行を書き換えるだけで対応が完了するようになります。こうした気配りが、運用保守のトラブルを未然に防ぎます。
# 運用スクリプト内の設定値を最初にまとめて定義する例
DATA_DIR="/var/cobol/data"
LOG_FILE="/var/cobol/log/batch.log"
echo "【運用開始】COBOLバッチ処理を実行します。"
./READABLE1 > ${LOG_FILE}
echo "【運用終了】ログを確認してください。"
このスクリプトを実行すると、中に書かれた設定値が呼び出され、作業の進捗状況が文字として丁寧に画面に案内されます。
【運用開始】COBOLバッチ処理を実行します。
【運用終了】ログを確認してください。
8. 誰が見ても迷わない綺麗な成果物を目指すために
プログラムの可読性を高める究極の目的は、「チームの誰もが同じように理解できるようにすること」です。自分だけしか読めないような、暗号のような複雑な書き方をしたコードは、プログラミングの世界では決して良いコードとは言われません。むしろ、中学生でも英語の辞書を片手に読めば全体の流れがスラスラと分かるような、シンプルで elementary(初歩的)な記述こそが、最も優れたメンテナンス性の高いプログラムです。
書き終わったあとは必ず自分で一度、声に出して読むか、上から下へと目で追ってみてください。もし少しでも引っかかったり、迷ったりする場所があれば、そこがまさに改善のチャンスです。コメントを足すか、段落を分けるか、名前を変えてみましょう。この丁寧な繰り返しが、何十年も動き続ける頑丈で安全なシステムを支える土台となります。焦らずに、綺麗なプログラムを書く楽しさを感じながら一歩ずつ進んでいきましょう。