2007.12.26

スマートなコード

なまじっか配列や DBのSQLをしっかり習ってしまうと、
それを利用することばかりに頭がいくため、
本来はもっとスマートに書けるはずのコードを
逆にゴテゴテ書いてしまったりする場合がある。


例えば、
 定義ファイルにカンマ区切りで日付が記述されている。
 本日が指定した日に該当すれば Trueそうでなければ Falseを返す。

というような仕様の場合、以下のように発想して
 1.最後まで Hitしない時のために戻り値に Falseをセット。
 2.カンマで Splitして配列にする。
 3.ぐるぐるループして Hitすれば戻り値に Trueをセット。

例えば VB.netでは以下のような“ちょっとした”プログラムを書きがち。

Dim b1 As Boolean = False
  For Each v1 As String In sDefDays.Split(","c) : If (DateTime.Now().Day = CType("0" & v1, Integer)) Then : b1 = True : Exit For : End If : Next
  System.Console.WriteLine(b1)

しかもこいつはお行儀が悪いため潜在的な Bug候補があって、
他の言語系にそのまま持ってけない場合がある。
(先頭に 0が付いた数字文字列は 8進数扱いしたりする言語系があるからね)


でも、発想を変えてみると仕様を満たすには以下だけで Okだったりする。

System.Console.WriteLine( _
  0 <= ("," & sDefDays & ",").IndexOf("," & CType(DateTime.Now().Day, String) & ",") _
 )

いわゆる『番兵』の応用。
この発想はどの言語にもそのまま持っていける。
ループもない(ライブラリ任せ)ので速い。

あなたの頭のコードスニペットは、最適化されてますか?

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ichikawa