なあ、これって XXX を書けばすっきりするんじゃないか?
桜が咲いてましたね。
さて、ギョームなコードを読んでいると、これって XXX を書けばすっきりするんじゃね? とか これって XXX で書けばすっきりするんじゃね? というのをよく見かけます。
なあ、これって foreach で書けばすっきりするんじゃないか?
よく見るのが foreach で書けるものを for で書いているコードです。
みっともないからお止しなさいっ♪ と思っています:
for ( int i = 0; i < aDataGrid.Items.Count; ++ i ) { // // 以下、 aDataGrid.Items[i] を使った長ーーーーーーーーーーーーーーーーーーい処理 // }
DataGridItemCollection クラスは少なくとも IEnumerable インターフェースを実装しているので、foreach が使えます。
しかし、var で受けると item は object 型になってしまいます。
おそらくそれが厭で for を使っているのかもしれません*1が、var の替わりに DataGridItem と書いておけば暗黙的にキャストされて普通に foreach できます。
こんなアホコードは:
int i = 0; foreach ( DataGridItem item in aDataGrid.Items ) { // // 以下、 aDataGrid.Items[i] に変わりまして、item がお送りします… // }
こんな風に書くべきだと思います。
また、DataGridItem クラスは親切にも添字に使えるプロパティ ItemIndex を持っているので、カウンター変数の i も必要ないのです。
aDataGrid.Items[i] じゃなくて item と書けた方が個人的にはすっきりして分かりやすいのでおすすめです。
なあ、これって FindTypedControl() 使おうぜ!
どことは云いませんがこーいうところがありました:
DropDownList ddlTemplaKind = (DropDownList)aDataGrid.Items[i]Cells[TEMPLA_KIND].FindControl( "ddlTemplaKind" + i );
ぐへー、と思いましたね。
長い、長いよ!
こういう時は、FindTypedControl() を使うとすっきり書けますね。
FindTypedControl() はどこにも書いてありませんが、それは私がこれから書くからです。
上記のコードを見て、私が一番先に思い浮かべたのがこのようなインスタンスメソッドです:
private _FoundControl FindTypedControl<_FoundControl>(Control parentControl, string controlId) where _FoundControl : Control { var foundControl = parentControl.FindControl( controlId ) as _FoundControl; return foundControl; }
これを使うとさっきのコードはこう書けます:
var ddlTemplaKind = FindTypedControl<DropDownList>( item.Cells[TEMPLA_KIND],
string.Format( "ddlTemplaKind{0}",
item.ItemIndex ) );
美しいと思いませんか?
やりたいことがすぐに分かりますね。
また見つけたら書くかもしれませんが、これくらいしか覚えてなかったのでまた次回。
参考
*1:こんなコードを書くひとのことをあんまり考えたくないのでそーいう風に決めつけている