Tell us about the best/worst newbie programmer mistakes that you’ve. : programming
2009-11-29 04:42 /
for (int i=0; i < n; i++) {
switch (i) {
case 0:
doSomething(0);
case 1:
doSomething(1);
...
}
}
via Tell us about the best/worst newbie programmer mistakes that you’ve. : programming.
なるほど。確かに、「めんどくさいから機械に色々やらせよう」と考えてプログラムしてる(なので、Perl から始めたのだ<笑)人と違って、くそ真面目な人ほどこんなコードを書きそうだ。このケースでは、case 節が n 個あるなら、switch クローズなど不要である。doSomething( i ) の一行で事足りる。
似たようなコードは、The Daily WTF で以下のように紹介されている。
for(int i=0;i<3;i++)
{
switch(i) {
case 0: strFolder = 'C:\asdf'; break;
case 1: strFolder = 'C:\Windows\Temp';break;
case 2: strFolder = 'D:\v2'; break;
}
// do lots of stuff in the folder...
}
上記のコードは、先の引用と違って条件ごとの処理が異なっているし、処理内容も変数 i に依存してないため、switch クローズを省けない。しかし、無駄な書き方をしているという点では「考え方(アルゴリズム)」として同じ間違いのグループに入れて良いと言える。
変数 i は、for ループの中でしか意味をもっていないため(ループを抜けた後は常に最大値である)、別の場所で strFolder を使い分ける際に、条件に従って strFoler[0] ~ strFolder[254] から一つを使えばよい。もちろん、その「条件」が 0~254 の int 型の値を取るなら(case 節は本当は 255 あったらしい)、条件文すら不要である。というか、不要となるように設計するのが普通だ。(上記の引用で “do lots of stuff in the folder…” となっている箇所に変数 i に応じた処理が入るなら、strFolder へのアサインは、なおさら外に出してしまわなければ、パフォーマンスが酷く落ちることだろう。)
