🧩今日の学び
・PERFORMの外へGO TOで飛ぶと、VARYING更新やUNTIL判定が実行されずループ構造そのものが壊れる
・GO TOは「行儀が悪い」のではなく、「どこまで処理したかをコードから消してしまう」のが最大の罪
・今も残るGO TOは悪ではなく歴史の産物であり、使うためではなく“読めるようになる”ことが重要
な)あ、だったらーEND-PERFORMのそとに書いたらだめなんすか?
そうすると構造的には間違いないんじゃないかと?
係)…いい質問だ。何だお前、宇宙人に脳改造されたのか?
な)どういうことっすか!?
係)先に結論を言うぞ。
その形は「技術的には通ることが多い」が、意味としてはもっと危険になる。
PERFORMの外へGO TOするという選択:行儀が良く見える罠
係)まずお前が言うコードにするとこだな。
PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT
IF STATUS(I) NOT = "OK"
GO TO NEXT-REC
END-IF
DISPLAY "処理する:" I
END-PERFORM
NEXT-REC.
な)ほらー、PERFORMの外に出したから「行儀よくなった」ように見えるじゃないすかー。
係)見た目だけはな。
このGO TO NEXT-RECは、PERFORMの中からPERFORMの外へジャンプしている。
つまり
• ループ制御を途中で破壊
• VARYINGの更新処理をすっ飛ばす
• UNTIL条件の評価もすっ飛ばす
ということだ。
何が壊れるのか:VARYING更新とUNTIL判定の破壊
係)それの何が怖いかを具体的にいうとだな、PERFORM VARYING は本来こう動くわけだ。
Iを初期化
条件チェック
本体実行Iを更新
条件チェック
繰り返し
でもGO TOで外に飛ぶと
Iを初期化
条件チェック
本体実行GO TO NEXT-REC← ここで脱走
Iの更新が行われず、PERFORMの後処理が実行されないと。
結果どうなるか
• ループが途中で壊れる
• Iの値が中途半端
• 処理が「正常終了」したように見える
• でも実は 途中放棄
EXIT PERFORMですらなく「構造破壊脱出」だ。
正直に言うとな、これは「昔は仕方なくやってたやつ」だ。
構造化文が弱い時代
END-PERFORMがなかった頃
逃げ道として使われた
だから現代ではこう言われる
「動くけど触るな」
「壊れてないように見える壊れ方」
「テストが通っても安心できない」
一行でまとめると、PERFORMの外にGO TOで飛ばすのは、ループを“黙って殺す”行為。
な)じゃあ結局、
• 中にラベル → 行儀が悪い
• 外にラベル → 構造破壊
って話ってことっすか?
係)そう。
だから「GO TOを選んだ時点で詰む」って話になるわけだ。
な)ふむー。
GO TOは悪者と。逮捕間近と。行儀悪い罪ですか。
やっぱ炎上系はいくないって感じですねー。
係)お前炎上系動画とか撮影してそうだな…。やめろよほんとに。捕まるなら一人で捕まれよ。
な)せめて専務ぐらいは道連れに!
係)なんでだよ!
な)だって嫌な奴って、係長が…
係)お前!なんで言うんだよ!!
な)あれ?ちょっとまってくださいよ。
過去、仕方なく使っていたってことは、今も使われている可能性は高いってことじゃないすか?
係)ハァ……そうだ。
GO TOは「過去の遺物」じゃない。今も“普通に生きてる”現役コードだ。
理由は感情論じゃない。全部、構造的理由がある。
GO TOはなぜ今も残っているのか:悪ではなく歴史の問題
① システムが「古すぎて」直せない
• 30年〜40年物の基幹系
• 行数:数十万〜数百万
• 修正=業務停止リスク
結論:動いてる以上、触らない。
② 当時は「正解」だった
昔の COBOL では、
• END-PERFORMがない
• 構造化IFが弱い
• EXIT PERFORM CYCLEなんて存在しない
だから当時の最適解はGO TOで抜ける。
悪意じゃない。時代の最適解。
③ ベテランが“慣れすぎている”
- 頭の中に制御フローがある
- 自分では迷わない
- でも他人は読めない
属人化の温床。
つまり本題は「GO TOが残っている ≠ GO TOを使っていい」ということになる。
そのために、EXIT / CYCLEに脳内変換できるようにしておけ。
GO TOが何をしたかったか
どこを抜けたかったか
何をスキップしたかったか
そして新規では使わないようにするんだ。
EXIT PERFORM
EXIT PERFORM CYCLE
構造化IF
こういった代替が揃ってる以上、理由がないからな。
GO TOは「今も使われている」からこそ「使う方法を知るのではなく、読めるようになること」こそが大事なんだよ。
おむすび
な)分かりづらいをなくしていこうという精神が受け継がれたわけですね。
係)そうだな。
な)でも、もっとわかりやすくする努力が必要ですね。
係)どこの高台から物言ってるんだよ。
努力すれば済む話だろ。最近の若いやつは全く。 (ブツブツ)
な)やっぱ説教してるんすね…キャバクラで…
係)…違うっての!
係長のワンポイント
PERFORMの外にGO TOで飛ぶのは、「行儀が良い」のではなく制御を黙って破壊する行為だ。VARYINGの更新もUNTILの判定も通らず、ループは途中で“殺された状態”になる。
怖いのはエラーにならず、正常終了したように見えるところだ。
これはEXITですらなく、「構造を持たない脱走」に近い。
動くから安全じゃない──読めない制御フローは、必ず後で牙をむく。

コメント