もし、あなたが「IF文がどんどん重なって、もうワケワカメ…」なんて頭を抱えているなら、まさにこの記事は運命の出会いかもしれません!
COBOLには、そんな複雑になりがちな条件分岐を、まるで魔法のようにスッキリ整理してくれる「EVALUATE(エバリュエート)文」という頼もしい味方がいるんです。
この記事では、COBOL初心者さんに向けて、EVALUATE文の世界をやさしく、そして楽しく解説していきます。
読み終わる頃には、「なるほど、EVALUATE文って便利じゃん!」ってきっと思ってもらえるはず。
この記事で、あなたはこんなことができるようになりますよ。
- EVALUATE文がどんなものか、サクッと理解できる!
- EVALUATE文の基本的な書き方ルールをマスターできる!
- 実際のコード例を見て、使い方を具体的にイメージできる!
- IF文とどっちを使うべきか、迷わなくなる!
「COBOLのEVALUATE文」多岐分岐とは何か?IF文との違い
さて、さっそく「EVALUATE文」とは何者なのか、その正体に迫ってみましょう!
簡単に言うと、EVALUATE文は「たくさんの選択肢の中から、条件に合ったものを一つだけ選んで実行する」ためのCOBOLの命令です。
例えば、「もし信号が青なら進む、黄なら注意、赤なら止まる」みたいな、複数の条件で処理を分けたいときに大活躍します。これを「多岐分岐(たきぶんき)」と呼んだりしますね。
「あれ?それってIF文をたくさん重ねてもできるんじゃない?」と思ったあなた、鋭い!
確かに、IF文をネスト(入れ子に)すれば、同じようなことは実現可能です。
でも、条件が増えてくると、IF文のネストはこんな感じになりがち…
IF 条件A THEN 処理A ELSE IF 条件B THEN 処理B ELSE IF 条件C THEN 処理C ELSE 処理D END-IF END-IF END-IF
うーん、ちょっと見た目がゴチャゴチャして、どこで何をしているのか分かりにくいですよね?
一方、EVALUATE文を使うと、もっとスッキリ書けるんです!
EVALUATE 対象 WHEN 条件A 処理A WHEN 条件B 処理B WHEN 条件C 処理C WHEN OTHER 処理D END-EVALUATE
どうでしょう? まるで箇条書きみたいで、どの条件でどの処理をするのか、一目で分かりやすいと思いませんか?
これがEVALUATE文の大きなメリット、「コードの見た目がスッキリして、読みやすくなる」点なんです。
「COBOLのEVALUATE文」多岐分岐の基本的な書き方(構文)
EVALUATE文の魅力が分かったところで、次は具体的な書き方のルール、つまり「構文」を見ていきましょう。
基本の形はこんな感じです。
EVALUATE 評価したいもの WHEN 条件1 条件1に一致した場合の処理 WHEN 条件2 条件2に一致した場合の処理 WHEN 条件3 条件3に一致した場合の処理 ... WHEN OTHER どの条件にも一致しなかった場合の処理 END-EVALUATE
それぞれのキーワードには、こんな意味があります。
- EVALUATE
- 「これから条件判断を始めますよー!」の合図。後ろに、何を基準に判断するか(評価対象)を書きます。
- WHEN
- 「もし〇〇だったら~」の「もし」の部分。ここに具体的な条件を書きます。WHENはいくつでも並べられます。
- 処理
- 各WHENの後には、その条件が成り立った時に実行したいプログラムの命令を書きます。
- WHEN OTHER
- 「どのWHENの条件にも当てはまらなかったら~」という場合の処理を書きます。これは省略することも可能です。
- END-EVALUATE
- 「EVALUATE文はここまでですよー」の終わりの合図。これを忘れるとエラーになるので注意が必要です。
基本の骨格はこれだけ!思ったよりシンプルでしょう?
次に、それぞれの部分をもう少し詳しく見ていきますね。
EVALUATEの対象指定
EVALUATEの後ろには、「何を基準に条件を判断するか」を指定します。
ここには、いくつかのパターンがあります。
- 変数を指定する
- EVALUATE WS-CODE のように、データ項目(変数)を指定します。この場合、WHEN句ではこの変数の値が何かをチェックします。一番よく使われるパターンかもしれません。
- 式を指定する
- EVALUATE WS-A + WS-B のように、計算式を指定することも可能です。WHEN句では、この計算結果の値が何かをチェックします。
- TRUEを指定する
- EVALUATE TRUE という、ちょっと面白い指定方法もあります。これは、「常に真(TRUE)」を評価対象にする、という意味です。この場合、WHEN句にはそれぞれ独立した条件式(例:WHEN WS-A > 10)を書くことになります。EVALUATE TRUEは柔軟な条件設定が可能です。まるで、IF, ELSE IF, ELSE... を並べるような感覚で使えますよ。
どのパターンを使うかは、実現したい処理によって使い分けるのがコツです。
WHEN句の書き方:条件を指定する
WHENの後には、具体的な条件を記述します。
ここにもいくつか書き方がありますよ。
- 特定の値と一致するかチェック
- WHEN 1 や WHEN "A" のように、特定の値や文字列リテラルを書きます。EVALUATEで指定した対象が、この値とピッタリ一致するかどうかを見ます。
- 複数の値をまとめてチェック (OR条件)
- WHEN 1 ALSO 3 ALSO 5 のように、ALSOで繋げると、「1または3または5のどれかだったら」という意味になります。便利ですね!
- 範囲を指定してチェック
- WHEN 1 THRU 10 のように、THRUを使うと、「1から10までの範囲だったら」という意味になります。点数に応じて成績をつける時なんかに役立ちます。THRUを使うと範囲指定が楽になります。
- 条件式を書く (EVALUATE TRUEの場合)
- EVALUATE TRUE を使った場合は、WHEN WS-A > 10 AND WS-B = "X" のように、比較演算子(>, <, = など)や論理演算子(AND, OR)を使った条件式を直接書きます。
これらの書き方を組み合わせることで、色々な条件分岐を実現できます。
WHEN OTHER句:どの条件にも当てはまらなかった場合
さて、最後に紹介するのがWHEN OTHER句です。
これは、一連のWHEN句で指定したどの条件にも、評価対象が当てはまらなかった場合に実行される処理を書く場所です。
いわば、「その他の場合」を一手に引き受ける、縁の下の力持ち的な存在ですね。
例えば、エラー処理やデフォルトの処理を記述するのによく使われます。
このWHEN OTHER句は、必ずしも書かなければいけないわけではありません。省略することも可能です。
ただし、想定外の値が入ってきたときに何も処理されない、という事態を防ぐために、予期せぬデータへの備えとしてWHEN OTHERは有効です。書いておくと、より安全なプログラムになることが多いですよ。
もしWHEN OTHERを書く場合は、必ずEND-EVALUATEの直前に、ひとつだけ記述します。
「COBOLのEVALUATE文」多岐分岐の使い方(サンプルコードと解説)
理屈がわかってきたところで、いよいよ実践です!
EVALUATE文を使った簡単なサンプルプログラムをいくつか見て、使い方に慣れていきましょう。
ぜひ、お手元の環境で実際に動かしてみてくださいね。
サンプル1:数値コードによる処理分岐
まずは、一番シンプルな例から。
部署コード(1:人事部, 2:営業部, 3:開発部)に応じて、部署名を表示するプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. EVALUATE-SAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-DEPT-CODE PIC 9(1). 88 DEPT-JINJI VALUE 1. 88 DEPT-EIGYO VALUE 2. 88 DEPT-KAIHATSU VALUE 3. 01 WS-DEPT-NAME PIC X(10). PROCEDURE DIVISION. MAIN-PROC. MOVE 2 TO WS-DEPT-CODE. *> ここで部署コードを設定 (今回は2:営業部) EVALUATE WS-DEPT-CODE WHEN DEPT-JINJI *> コードが1 (人事部) なら MOVE "人事部" TO WS-DEPT-NAME WHEN DEPT-EIGYO *> コードが2 (営業部) なら MOVE "営業部" TO WS-DEPT-NAME WHEN DEPT-KAIHATSU *> コードが3 (開発部) なら MOVE "開発部" TO WS-DEPT-NAME WHEN OTHER *> 上記以外なら MOVE "不明な部署" TO WS-DEPT-NAME END-EVALUATE. DISPLAY "部署コード: " WS-DEPT-CODE. DISPLAY "部署名 : " WS-DEPT-NAME. STOP RUN.
【解説】
EVALUATE WS-DEPT-CODEで、変数WS-DEPT-CODEの値を評価対象にしています。
WHEN句では、88レベルで定義した条件名(DEPT-JINJIなど)を使っています。こうすると、WHEN 1と書くよりも意味が分かりやすくなりますね。
今回はWS-DEPT-CODEに2を入れているので、WHEN DEPT-EIGYOの処理が実行され、WS-DEPT-NAMEに「営業部」がセットされます。
特定のコードで処理を分ける基本パターンです。
【実行結果】
部署コード: 2 部署名 : 営業部
サンプル2:成績評価(範囲指定THRUの活用)
次は、テストの点数に応じて成績(優・良・可・不可)を表示するプログラムです。
ここではTHRUを使った範囲指定が登場しますよ。
IDENTIFICATION DIVISION. PROGRAM-ID. EVALUATE-SAMPLE2. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SCORE PIC 9(3). 01 WS-GRADE PIC X(4). PROCEDURE DIVISION. MAIN-PROC. MOVE 75 TO WS-SCORE. *> ここで点数を設定 (今回は75点) EVALUATE WS-SCORE WHEN 90 THRU 100 *> 90点から100点なら MOVE "優" TO WS-GRADE WHEN 80 THRU 89 *> 80点から89点なら MOVE "良" TO WS-GRADE WHEN 60 THRU 79 *> 60点から79点なら MOVE "可" TO WS-GRADE WHEN OTHER *> それ以外 (0点から59点) なら MOVE "不可" TO WS-GRADE END-EVALUATE. DISPLAY "点数: " WS-SCORE. DISPLAY "成績: " WS-GRADE. STOP RUN.
【解説】
EVALUATE WS-SCOREで点数を評価しています。
WHEN 90 THRU 100のように、THRUを使うことで「90点以上かつ100点以下」という範囲を簡単に指定できます。IF文で書くと IF WS-SCORE >= 90 AND WS-SCORE <= 100 のようになりますが、EVALUATE文の方がスッキリしますね。
今回はWS-SCOREに75を入れているので、WHEN 60 THRU 79の条件に一致し、「可」が表示されます。
THRUの実践的な使い方がわかります。
【実行結果】
点数: 075 成績: 可
サンプル3:EVALUATE TRUEを使った複数条件の評価
最後に、EVALUATE TRUEを使った例を見てみましょう。
注文の種類('A'か'B'か)と、注文数(100以上か未満か)によって処理を変えるプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. EVALUATE-SAMPLE3. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ORDER-TYPE PIC X(1). 01 WS-ORDER-QTY PIC 9(3). 01 WS-MESSAGE PIC X(30). PROCEDURE DIVISION. MAIN-PROC. MOVE "A" TO WS-ORDER-TYPE. MOVE 120 TO WS-ORDER-QTY. *> 今回はタイプA、数量120 EVALUATE TRUE *> 条件式自体を評価する WHEN WS-ORDER-TYPE = "A" AND WS-ORDER-QTY >= 100 MOVE "タイプA:大口注文です" TO WS-MESSAGE WHEN WS-ORDER-TYPE = "A" AND WS-ORDER-QTY < 100 MOVE "タイプA:通常注文です" TO WS-MESSAGE WHEN WS-ORDER-TYPE = "B" MOVE "タイプB:特別注文です" TO WS-MESSAGE WHEN OTHER MOVE "不正な注文タイプです" TO WS-MESSAGE END-EVALUATE. DISPLAY "注文タイプ: " WS-ORDER-TYPE. DISPLAY "注文数 : " WS-ORDER-QTY. DISPLAY "メッセージ: " WS-MESSAGE. STOP RUN.
【解説】
EVALUATE TRUEと書くことで、「これからWHEN句に書く条件式を順番にチェックして、最初にTRUE(真)になったものを選びますよ」という意味になります。
各WHEN句には、WS-ORDER-TYPE = "A" AND WS-ORDER-QTY >= 100のような独立した条件式を書けます。
今回はタイプA、数量120なので、最初のWHENの条件が真となり、「タイプA:大口注文です」が表示されます。
IF文のIF... ELSE IF... ELSE...の構造に似ていますが、複雑な条件分岐もこれでスッキリします。
【実行結果】
注文タイプ: A 注文数 : 120 メッセージ: タイプA:大口注文です
「COBOLのEVALUATE文」多岐分岐を使う上での注意点
EVALUATE文、便利ですよね! でも、使う上でちょっとだけ気をつけておきたいポイントもあります。
より良いコードを書くために、以下の点を頭の片隅に置いておきましょう。
IF文との使い分けを意識する
EVALUATE文は多岐分岐に強いですが、どんな時でもEVALUATE文がベストとは限りません。
IF文の方が適している場面もあります。
じゃあ、どう使い分けるのがいいのでしょう?
明確なルールはありませんが、一般的にはこんな風に考えると良いかもしれません。
- EVALUATE文が向いているケース
- 3つ以上の選択肢がある場合
- 1つの変数や式の値によって分岐する場合 (例: コードの値、点数の範囲)
- 条件が比較的シンプルで、一覧性が求められる場合
- IF文が向いているケース
- 単純な2択の分岐 (IF ... ELSE ... END-IF)
- それぞれの条件が全く独立していて、EVALUATE TRUEを使うと逆に複雑になりそうな場合
- 非常に複雑な条件式が少数だけある場合
結局のところ、「どちらがより読みやすく、理解しやすいか」という観点で選ぶのが一番です。
絶対的な正解を求めすぎず、状況に応じて最適な方を選びましょう。プログラムは自分だけでなく、他の人が読む(保守する)可能性も常にありますからね!
また、EVALUATE文のWHEN句に書く処理があまりにも長くなる場合は、PERFORM文で別の段落に処理をまとめる(サブルーチン化する)と、さらにコードがスッキリして見通しが良くなりますよ。
【まとめ】COBOLのEVALUATE文をマスターして分かりやすいコードを!
お疲れ様でした!今回はCOBOLの頼れる助っ人、「EVALUATE文」について探検してきました。
ポイントを振り返ってみましょう。
- EVALUATE文は、たくさんの条件で処理を分ける「多岐分岐」に便利な命令です。
- IF文のネストよりも、コードがスッキリして読みやすくなります。
- 基本的な構文は EVALUATE 対象 WHEN 条件 ... END-EVALUATE です。
- ALSOやTHRU、EVALUATE TRUEを使いこなせば、柔軟な条件指定が可能です。
- WHEN OTHERで、どの条件にも当てはまらない場合の処理も書けます。
- 何でもかんでもEVALUATE文ではなく、IF文との使い分けも意識しましょう。
EVALUATE文を使いこなせるようになれば、あなたの書くCOBOLプログラムは、きっと今よりもっと分かりやすく、そして保守しやすくなるはずです。
今回学んだ知識を、ぜひ実際のプログラミングで試してみてくださいね。
最初はちょっと戸惑うかもしれませんが、使っていくうちにきっと「EVALUATE文、便利!」と実感できると思います。
自信を持って、どんどんコードを書いていきましょう!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。