読者です 読者をやめる 読者になる 読者になる

日本語識別子,Member Renaming,strong-typed reflection

.NET

「新日々此何有哉」より.

ワールドワイドに公開するようなソースの場合、外部公開の識別子は最大公約数をとって、英語にするしかないか、やっぱ。

IntelliSense 主導開発 (良くも悪くも,ドキュメントビューアを起動することなく,勢いで書いていくスタイル) では,識別子はそれ自体が能弁であることを求められます.*1
んでまあ C# なんかだと,リファクタリングツールの精度が良いため,後で Member Renaming すればいいやと「便利な」名前を暫定採用できたりするわけですが,このとき困るのは文字列中の識別子名です.
列挙型なんかだと,「まあいっか」と入出力周りで Enum.Parse を使ってべたべたにくっつけるケースがありますが,これはちょっと置きましょう.今回紹介するのは,以下のように Reflection 絡みで識別子名が文字列に書かれてしまうのを回避する方法です.

MethodInfo method = typeof(Mock).GetMethod("PublicMethodParameters", new Type[] { typeof(string), typeof(int) }));

Daniel Cazzulino 氏は,『Linq beyond queries: strong-typed reflection! 』で,ラムダ式周りの推論規則を,MemberInfo のキャプチャに利用したこんな書き方を提案されています.

MethodInfo info = Reflector.Method<Mock, string, int>((x, y, z) => x.PublicMethodParameters(y, z));

これによりメソッドシグネチャの型検証が行われるというメリットももちろん大きいですが,文字列として書かないことで Member Renaming の対象になる点でも中々興味深いかもしれませんね.

*1:『[http://www.radiumsoftware.com/hungarian_notation.html:title=Hungarian Notation]』,『[http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B:title=間違ったコードは間違って見えるようにする]』