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