先日、ひどいソースを見た、というような話になって思い出したんだが、私が見たことのあるソースで、一番いやだったのは:
「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 ラベル。これは、ちょっと書いてみたけど捨てたのか、あるいは捨てずに製品に組み込まれたのか憶えてない。
書いたのは私。正しく動くことは確認した憶えがある。そういうことを書くのはやめておけと言われた憶えもある。