鍋あり谷あり

テーマを決めずに適当に書いています。

いやがられるソースコード

先日、ひどいソースを見た、というような話になって思い出したんだが、私が見たことのあるソースで、一番いやだったのは:

「if 文の then ブロックの途中から else ブロックの途中へジャンプ」

である。
具体的には:

void lemon(){
  if ( orange() ){
    // ここに10行
    if ( apple() ){
      // ここに10行
      if ( strawberry() ) goto kiwi;
      // ここに10行
    } else {
      // ここに10行
    }
  } else {
    // ここに10行
    if ( mango() ){
      // ここに10行
kiwi:
      // ここに10行
    } else {
      // ここに10行
    }
  }
}

こんな感じ。
こんなことを書いてしまうこともさることながら、これが正しく動くと(一瞬でも)思えるところもすごいと思った。
ちなみに、正しく動いていたのかどうかは知らない。

それで思い出した別の邪悪なコード。

switch( grape ){
default:
  if ( banana() ){
    // do something.
case 0:
case 1:
    // do something.
  } else {
    // do something.
case 2:
case 3:
    // do something.
  }
}

レベルの違う場所に置かれた case ラベル。これは、ちょっと書いてみたけど捨てたのか、あるいは捨てずに製品に組み込まれたのか憶えてない。
書いたのは私。正しく動くことは確認した憶えがある。そういうことを書くのはやめておけと言われた憶えもある。