やっぱ実行時よりビルド時
動的コード生成 VS ビルド時コード生成
こないだ、動的コード生成がらみのネタで1ページ書いて公開したところ、「ビルド時で済むものは動的コード生成じゃなくてビルド時コード生成にして欲しい。」との至極まっとうなご意見をいただきまして。
最近、ViewModel の実装が面倒という問題に対して、DynamicObject を使った動的プロキシが流行ってるみたいだけど、ViewModel なんてビルド時コード生成で事足りる最たるもので、あんまり動的にやって欲しくないという。まあ、ごもっとも。
まあ、僕としても方向性としてはおおむねこの意見に割かし賛成だったり。具体的には:
- DynamicObject の実装が思いのほか簡単なので、「手抜き実装」としてはあり。
- ちゃんとやるならやっぱり静的に(ViewModel 手書きするか、ビルド時コード生成するか)した方がいいと思う。
くらいに思っています。
dynamic は、ちゃんと使えば静的なコードの5~10倍程度のペナルティで済むという話に対しても、「過度に恐れる必要もないけども、そりゃ避けれるなら避けるよね」くらいの立ち位置。動的にやるのが避けられない状況(例えばユーザーの入力に応じたコード生成が必要とか)になっても別に慌てなくてもいいよという。
テキスト テンプレート
現状、Visual Studio 使って開発するなら動的コード生成の方が楽なんですよねぇ、微妙に。ビルド時コード生成よりも。ほんと、微妙に。式ツリーとか CallSite になれてる人ってのもそう多くないでしょうけども、自分的には。正直、ビルド時コード生成は次(か、ひょっとしたらそのさらに次くらい?)のバージョン待ちかなぁなどと思っていたり。
というような話をすると「T4 を使え」とのご意見もらいまして。前は日本語情報なさ過ぎてちょっとくじけてた T4 テンプレートを、久々に調べて使ってみるなど。
でも、T4 は何か微妙に使いづらいなぁとか考えてたら、昔、元同僚が「テキスト テンプレートなんてヒア文字列と、文字列中での変数展開だけあればいい」って言ってたのを思い出したり。そうよ、PowerShell の方がたぶん使いやすい!
ということで、ちょっと書いてみました、PowerShell でテキスト テンプレート。
- データ定義: SampleClass.xml
- テンプレート: ViewModelTemplate.ps1
使い方は、
$x = [xml](Get-Content 'SampleClass.xml') .ViewModelTemplate.ps1 $x.Definition > SampleClass.cs
出力されたファイルは以下のような感じ。
- 出力された C#: SampleClass.cs
悪くはないかも。まあ、Visual Studio と統合されてるわけじゃないのが微妙ですけども。もうすっかりゆとりで、IntelliSense なしでコード書くのが苦痛だったりしますし。あと、定義ファイルが XML なのも微妙だし。XSD 書けば多少マシになりますが。
コメントを残す