【COBOL 読み3-5-2】GO TOとIFは結局地獄?〜係長の知識をキャバクラで

🧩今日の学び
IF地獄は「どこで条件に引っかかったのか」が見えなくなり、GO TO地獄は「どこへ飛ぶのか」が見えなくなる
EXIT PERFORM CYCLEは「今回だけ処理しない」という意図を、コード1行で読者に伝えられる
・長生きするコードは短さではなく、“意図が追えるか”で価値が決まる

なるお)また地獄とか言ってますけど、係長、地獄とか読めないとか得意ですよね。

実際にどうなるのかがないと、言うは易しじゃないっすか?

「35℃のぬるま湯でいつまでつかっておけ!」地獄じゃないすかそれ?

実際は係長は使ってるけど、俺には教えてあげないんだから!って今どきドツンデレじゃないんですか?

係長)お前にそこまで気を使うと思うか?

お前に教えても「わからないー」と言わせたほうが気持ちいいわ!

な)そんな!優しく教えてくださいよ!

係)赤ん坊にでもわかるように教えてるわ!

ったく、そこまで言うなら、ちゃんと“地獄”を見せてやるよ。

な)いっつも地獄言うから地獄の価値がだだ下がりですよ。ストップ安ですよ。上場廃止ですよ。

係)いいから黙って読めっての。

やることはこうだ。

データを1件ずつ処理して、不要なものはスキップする

同じ処理を3通りで書いていくぞ。

IFでネストを増やした場合

PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT
    IF STATUS(I) = "OK"
        IF TYPE(I) = "A"
            IF AMOUNT(I) > 0
                DISPLAY "処理する:" I
            END-IF
        END-IF
    END-IF
END-PERFORM

な)…べ、別に普通じゃないすか?何してんのかわからないすけど…

係)今はな。これが現場で1年後こうなる。

PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT
    IF STATUS(I) = "OK"
        IF TYPE(I) = "A"
            IF AMOUNT(I) > 0
                IF FLAG(I) NOT = "X"
                    IF DATE(I) <= TODAY
                        DISPLAY "処理する:" I
                    END-IF
                END-IF
            END-IF
        END-IF
    END-IF
END-PERFORM

な)…あ、なにがどうなってそうなるんすか…

係)読めない、の正体は「どこでスキップされたか分からない」だ。

あとの担当者が追加で処理を入れようとしたとき、IF文を崩して作り直すより、IF内にネストしたほうが安全だと判断するってことだ。

そして、より読みづらくなっていき、次の担当はもっとわかりづらくなっていく。

前後のコードも合わせてどこがどこに対応しているのか把握しないとならんしな。

GO TOで飛ばした場合

PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT
    IF STATUS(I) NOT = "OK"
        GO TO NEXT-REC
    END-IF

    IF TYPE(I) NOT = "A"
        GO TO NEXT-REC
    END-IF

    IF AMOUNT(I) <= 0
        GO TO NEXT-REC
    END-IF

    DISPLAY "処理する:" I

NEXT-REC.
END-PERFORM

な)…あれ?こっちの方が分かりやすくないすか?

係)この段階ではな。

しかし、これがさらに悪化するとこうなってくる。

    IF STATUS(I) NOT = "OK"
        GO TO SKIP-A
    END-IF
    ...
SKIP-A.
    IF FLAG(I) = "X"
        GO TO SKIP-B
    END-IF
    ...
SKIP-B.
    GO TO LOOP-END

係)こうなってくると

どこから飛んだ?

どこに戻る?

ここは同じループか?

全部、追跡していかないとわけが分からなくなる。

それを何もしらない担当がやってきたときに、やらされるというわけだ。

な)ええー。だったら、俺もってくるんで係長が謎を解いてくれれば。

俺は流通担当ってことで、コードを持ってくる。

あと、係長を現場に運ぶ担当でもいいですよ。

係長は謎解き担当兼修正担当兼責任担当兼クレーム担当で。

係)お前は地獄の渦中でぬるま湯に浸かってふやけてろよ。

EXIT PERFORM CYCLE

係)おれが書くならこうだ。

PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT

    IF STATUS(I) NOT = "OK"
        EXIT PERFORM CYCLE
    END-IF

    IF TYPE(I) NOT = "A"
        EXIT PERFORM CYCLE
    END-IF

    IF AMOUNT(I) <= 0
        EXIT PERFORM CYCLE
    END-IF

    DISPLAY "処理する:" I

END-PERFORM

な)あ、条件に引っかかったら、CYCLEが見えるから「今回やらない」って即わかる。

係)そうだな。

ネストしない
飛ばない
影響範囲が名前で分かる

これを知らないままIFGO TOを使うと、事故るから教えない。

な)「危ないから触るな」じゃなくって、「仕組みを理解してから使え」ってことかしら。

じゃ、GO TOもIFも使う場面はあるかもしれないってことすか?

係)簡単にわかりやすくなるなら、GO TOIFでもいいだろう?読みやすいんだったらな。

だが、こういったこの回だけループを抜きたい場合は、CYCLEが一番わかりやすいってことだ。

おむすび

係)まとめるぞ。

• IF地獄 → 条件の理由が見えない
• GO TO地獄 → 流れの行き先が見えない
• EXIT PERFORM CYCLE → 意図が一行で見える

大したことないのは“短いコード”なだけであって、長生きするコードは、こういうところで差が出るぞ。

な)やっぱ年の功っすね。キャバクラ好きなだけじゃないんすよね。尊敬です。

係) なんでキャバクラ好きになるんだよ!そこに尊敬を混ぜ込むなよ!

な)え?違うんすか?

係)お前が勝手にイメージ付けしただけだろが。

な)えー、でも苦虫噛み潰した顔で、キャバ嬢に説教してそうですが。最近の若いやつはけしからん!とかって。

係)俺にどういうイメージもってんだよ、お前…

係長のワンポイント

IF地獄の正体は「なぜスキップされたかが見えない」ことだ。
GO TO地獄の正体は「どこへ飛んだのかを追跡し続ける必要がある」ことだ。
EXIT PERFORM CYCLEは「今回は処理しない」という意思を、1行で明示できる。
ネストしない、飛ばない、影響範囲が名前で分かる──それが最大の強みだ。
短く書けるかより、長く生きるか──それが現場での正解だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする