Go to the world which has no 'goto'.

Twitter でこんなのを見かけた。

--- 以下フィクションのため実在の人物や団体などとは関係ありません ---

  kura「あのー、質問いいですか?何か、こういうコードがあっちこっちにあるんですけど。」

// 0.cpp
int foo(int a1, int a2)
{
  int result = 0;
  do {
     if(bar1(a1)) {
       break;
     }
     if(bar2(a2)) {
       break;
     }
     result = 1;
  } while(0);
  return result;
}

先輩「うん、それが何か?」

kura「なんで do ~ while で囲って途中で break してるのかなぁと。」

先輩「見やすいだろ?」

kura「そうですかね。こう書いても同じじゃないです?」

// 1.xpp
int foo(int a1, int a2)
{
  int result = 0;
  if(bar1(a1)) { return result; }
  if(bar2(a2)) { return result; }
  result = 1;
  return result;
}

先輩「それだと、関数の中身がもっと長くて複雑になったとき、見にくいだろ。」

kura「なるほど。しかしそれは do ~ while ~ break を使って解決すべき問題では無いのでは?」

先輩「でもな、他に一気に行ジャンプする方法は無いだろ?

kura「goto とか。」

先輩「goto かぁ笑。goto は良く無いぞ。コーディング規約でも禁止されている。

kura「いやでもこれ実質 goto じゃないですか?ほら。」

// 2.cpp
int foo(int a1, int a2)
{
  int result = 0;
  if(bar1(a1)) { goto ret; }
  if(bar2(a2)) { goto ret; }
  result = 1;
ret:
  return result;
}

先輩「だ・か・ら 笑 goto は禁止されてんだって。

kura「『goto が邪悪で、規約でも禁止していて、だから do ~ while ~ break を使って goto を再現するようにしている』というのは話の筋が通ってないような?」

先輩「(イラっ)しかし goto は使っちゃいけないからなぁ。」

kura「この記法よりも、なんなら goto の方が良いですよ。ジャンプ先が明示されてるし、ネストが減るし、goto like な振る舞いを期待する do ~ while なのか通常の do ~ while なのかを注意深く見分ける必要も無くなるし。」

先輩「でもな、コーディング規約を作った人はすごい人だったんだぞ。kura 君はもっと、なぜこの規約があるのか、もっと勉強した方が良いわ。」

kura「はい。んで、その理由をいま聞いているのですが。そもそも規約に『goto はダメだから代わりに do ~ while ~ break で代替するように』なんて書いてなかったような。」

先輩「規約ってのは何でも書いてあるわけじゃないんだよ笑。あのな、do ~ while ~ break を使う理由はただひとつ、goto はダメだからだ。

kura「... ウッス」