なまじっか配列や 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)
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) & ",") _
)
0 <= ("," & sDefDays & ",").IndexOf("," & CType(DateTime.Now().Day, String) & ",") _
)
いわゆる『番兵』の応用。
この発想はどの言語にもそのまま持っていける。
ループもない(ライブラリ任せ)ので速い。
あなたの頭のコードスニペットは、最適化されてますか?