🧩今日の学び
・糖衣構文は処理を簡略化するのではなく、内部動作を「見えなくする」だけの構文である
・SEARCHは短いが、ループ回数や増分を読む側に想像させるため理解コストが高い
・PERFORMは冗長でも、何が起きているかを隠さない構文である
なるお)つか、ヒューマノイドも間違いは犯すってことはいいんですけど、糖衣構文ってなんすか?
係長)だから、誰がヒューマノイドだよ!
な)えーだって自分からアンドロイドだって言ったんじゃないすかー。
係)うるっさいっての!掛詞でおれをおもちゃにすんな!
糖衣構文とは何か:処理は同じ、見た目だけが甘い
係)ったく、糖衣構文(とういこうぶん)」ってのはな、プログラマ界隈の言い回しで、中身は同じ処理なのに、見た目を“甘く”して書きやすくした構文だ。
な)甘い…?コーラより甘いっすか?
係)甘い。
な)よもぎ栗饅頭より甘いっすか?
係)甘い。
な)栗きんとん入り茶碗蒸しかと思ったら、栗きんとん入りのプリンだったときの自分の認識の甘さより甘いっすか?
係)うるせ!
な)え!?
係)糖衣錠ぐらいわかるだろ!
いいから、さっきのSEARCHをもう一回見ろ!
01 ITEM.
05 ITEM-REC OCCURS 5 TIMES
INDEXED BY IDX.
10 ITEM-ID PIC X(3).
10 ITEM-NAME PIC X(10).
01 TARGET-ID PIC X(3) VALUE "003".
MOVE "003" TO ITEM-ID(3).
MOVE "ORANGE" TO ITEM-NAME(3).
SET IDX TO 1
SEARCH ITEM-REC
AT END
DISPLAY "見つかりません"
WHEN ITEM-ID(IDX) = TARGET-ID
DISPLAY "見つけた: " ITEM-NAME(IDX)
END-SEARCH
な)あ、間違って直したあとのやつっすね。
係)うるさい。
そして、このコードを読んでみろ。
SET IDX TO 1
PERFORM UNTIL IDX > 5
IF ITEM-ID(IDX) = TARGET-ID
DISPLAY "見つけた"
EXIT PERFORM *> ここで抜ける
END-IF
SET IDX UP BY 1
END-PERFORM
IF IDX > 5
DISPLAY "見つかりません"
END-IF
な)ハイホー。
えーと、IDXを1と定義してと、IDXが5になるまでルーピングするとして、IFで条件はいって、ITEM-IDの1つ目から回してー合致したら、「見つけた」と表示。
合致しなかったら、END-IFに進んで、IDXが一つ増えて2つ目との照合に入っていくと。そんで3つ目のITEM-IDがTARGET-IDが003で合致するので、「見つけた」となる。
見つからなかったら、PERFORMを抜けて再度IFで確認して、最終的にIDXが6になっているから、条件満たして「見つかりません」表示っと。
あれ?SEARCHと処理同じっすよね?
SEARCHとPERFORMは何が違うのか:見えるものと隠れるもの
係)わかったか。
処理は同じ。書き方だけ違うんだ。
PERFORM版は
- ループが見える
- 終了条件が見える
- インクリメントが見える
SEARCH版は
- ループが隠れる
- インクリメントも隠れる
- 条件だけ書ける
な)PERFORMの方が「読みやすそう」ですよねー。SEARCHはWHENが後だったり、なんでIDXが1増えてんのかまったくわからなかったし⋯。
全然書いてないから、わかんないとか言っちゃったじゃないっすか!ホント失礼しちゃう!
係)…まぁ、見える、読めるってのがポイントだな。
糖衣構文の代償:短くなる代わりに、理解コストが上がる
係)いいか、糖衣構文はな、
- 短い
- きれい
- 書きやすい
でも代償として、「何が起きているか」が見えなくなるんだ。
な)SEARCHは全然みえなかったすよ!ほんとにもう!
係)なんで怒ってんだよ!
いいか、俺がSEARCHをあまり使わない理由は
- 読み手が「何回回るか」を想像しなきゃいけない
IDXの初期化忘れが事故になるAT ENDの動きが分かりづらい
PERFORMなら全部目に見えるわけだしな。
おむすび
な)だったら、ホイップクリームでいいじゃないっすか!
係)なんの話をしてんだ?
な)糖衣じゃなくてもホイップクリームで覆ってしまえば、薬だって楽勝だって話ですよ!
係)お、おう、…なんでそうなる?
な)糖衣ごときじゃ甘くないですからね!
今日からホイップクリーム構文ですからね!いいですね!
係)わかったよ…って、他所でそんなこと言えるか!
係長のワンポイント
糖衣構文は、処理を減らすんじゃない。
見せる責任を、読む側に移しているだけだ。SEARCHは短いが、ループも増分も頭の中で再生させられる。PERFORMは長いが、何が起きているかを隠さない。
甘さを選ぶか、読みやすさを選ぶか―それが構文選択だ。

コメント