なあ、これって 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:こんなコードを書くひとのことをあんまり考えたくないのでそーいう風に決めつけている