リフレクション? 関数分割?
Flex+Java(SpringFramework+iBatis)のPRJ異動から3ヶ月、気づいたらVB2008のコーディングをするようになっていました。
オブジェクト指向が分かれば何のことはない…とタカを括りながらも、VBではコンストラクタを継承できないなどいろんな驚き、気づきを貰いながらここまで何とかやってこれてます。
そんな私の今日の悩み。
下記のような事があり、リフレクションにするか関数分割するか迷ってます。
.NET Frameworkのリフレクションが遅いのであれば関数分割かなと。
ComboBoxとDataGridComboBoxColumnという2つの型があります。
この2つの型は、同じ名前のプロパティ(DataSource,ValueMember,DisplayMemberなどなど)を持ちながらも継承関係ではなく、インターフェースを持っていませんでした。
こんな2つの型に共通の設定を行いたいという要望が現場で上がりました。
そこでまず、現場の方々はこう考えました。
遅延バインディングに任せろ!(バリバリ
Sub foo(ByRef cmbBox As Object, ByVal dataSource As IList) cmbBox.DataSource = dataSource cmbBox.ValueMember = VM_XXXX ' ... End Sub
しかし、Option Strict Onを書いた途端にコンパイルエラー。浅はかな野望は脆くも崩れ去りました。
ここはコンパイルエラーをなくすことが先決。
現場の方々にすがりつかれましたので、リフレクションの出番ですよ! ということで以下のように書き換えました。
Sub foo(ByRef cmbBox As Object, ByVal dataSource As IList) Dim type As System.Type = cmbBox.GetType type.GetProperty("DataSource").SetValue(cmbBox, dataSource, Nothing) type.GetProperty("ValueMember").SetValue(cmbBox, VM_XXXX, Nothing) ' ... End Sub
…急いで直したのでNullチェックとか色々抜けてるのは後々直すとして。
思ったのは、「ホントにこれでいいのか?」ということです。パフォーマンス的に問題が出ることはないのだろうか。
素直に、別々の引数ComboBox、DataGridComboBoxColumnを持つ別々の関数にしておいた方が確実な気がしました。
もう少し考えてみます。