Tell us about the best/worst newbie programmer mistakes that you’ve. : programming

2009-11-29 04:42 / hittings

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 へのアサインは、なおさら外に出してしまわなければ、パフォーマンスが酷く落ちることだろう。)

コメントがあればどうぞ

monthly archives

yearly archives

archive

microformat (vCard)

KAWAMOTO Takayuki

Mr. KAWAMOTO Takayuki
also known as philsci
(birth day: Sep 20 1968)
live in Osaka city, Osaka, Japan.

promotions

accounts

banners