DIContainer with AOP
2005-03-14 - Kazzzの日記で書いた現在開発中の.NET用GUIクライアントフレームワークですがインタフェースと実装の分離とテスト駆動開発の推進の為にSeasar2(http://www.seasar.org/)等を参考にしたDIContainerを備えています。
そこでどうしようかと思っているのがAOP(Aspect Oriented Programming)も採り入れたいということ。DIContainerとAOPは相性が良く著名なDIContainerはなんらかの形でAOPをフレームワークに組み込んでいる例が多いのです。AOPを採用することでクラスという括りでは扱いにくいコード塊を分離する事が可能になっているのですが特にSeasar2のAOPは使ううえでの割り切りかたがとても潔くシンプルなのでやはりこれを参考にしたいのだけれど、いかんせん.NET上でのAOPの実装をどうしようか悩んでおり未だに作業が進んでいないのです。
今考えているのは
1. .NET FrameworkのProxy(TransparentとReal)とmessage sinkを利用して完全自作する 2. 著名な.NETのAOP実装を利用する
できれば2.を採りたいのだけれどAOPといえばAspect-Jの使用経験しかなく.NETでのAOPの実装などほとんど知らないので何が良いのかさっぱり。
どなたか.NET上でのAOP実装の御薦め等あれば是非教えてくださいませ。
JとNインタラクティブデバッグ比較
Visual Studio® 2005 Beta2におけるC#に追加された機能のうち目玉の一つがエディットコンティニュ(以降E&Cと略)です。ご指定のページが見つかりません
VBには元々あった機能らしいのですがVisual Studio® 2003におけるC#では使うことができませんでした。Javaの世界ではE&Cという呼び名はありませんがJPDA(Java Platform Debugger Architecture)としてJava2よりインタラクティブなデバッガインタフェースが確立されており標準化されているのでJavaの殆どのIDEではE&Cと同様の機能は既に実現されています。
このようなインタラクティブなデバッギングは賛否両論ですが私のような不精な人間にとっては「ここだけちょっとコメントアウトして実行してみよう」とか「本当に変数がこの値になっているか今すぐ見てみよう」等の「試しに〜してみよう」という用途には抜群の効果を発揮します。私などはこの機能があるだけでIDEを使用しているようなものです。それでいてEclipse等の場合はそれ程デバッグ時の反応が極端に悪くなったりIDEごと落ちたりすることもなく非常に安定しているのでいい時代だなぁ、なんて思ったりする訳です。
そんな中で期待していたC#のE&Cですが正直な所Javaに比べると現状ではかなり貧弱で私としてはちょっとがっかりしています。
例えば以下のようなメソッドがあったとします。
100|protected virtual void EnterHandler(Object sender, EventArgs e) 101|{ 102| string newGuide = null; 103| try 104| { 105| newGuide = this.mesProvider.GetMessage(guide); 106| } 107| catch 108| { 109| if (constraint.AlterMessage != null && constraint.AlterMessage.Length > 0) 110| { 111| newGuide = constraint.AlterMessage; 112| } 113| } 114| this.ValidateItem.StatusLineManager.SetMessage(newGuide); 115|}
ここで試しに105行めを実行させたくないのでコメントアウトして実行させたいとします。Java、例えばIDEにEclipseを使用しているのであればこのような場合は即座に105行めをコメントアウトしてソースコードを上書きするとその瞬間にビルドがバックグラウンドで走りすぐさま最新のコードでデバッグが可能となります。
これがVisual Studio® 2005 Beta2だと105行めをコメントアウトしようとするといきなり
というダイアログが表示されて怒られます。どうやらE&Cは予めブレーク等でデバッガがプログラムを止めている状態じゃないとコードを書換えることを許してくれないようです。
更にここで今度はコメントアウトした105行めをやっぱり動かしたいから、とその場でコメントアウトを外してコードを有効にした場合、Eclipseの場合は再度ビルドが走り制御がこのメソッドから抜け出ていない場合はスタック等はリセットされてメソッドの先頭から再度実行されますがVisual Studio® 2005 Beta2の場合、コードをブレークした上でコメントアウトを外しても次回に当メソッドが実行されるまではコードの変更は反映されません。
E&Cが更に問題だと思うのはE&Cを有効にした場合のデバッグ時のIDEの反応の鈍さです。β2になりVisual Studio® 2005のデバッグトレースはかなり使いやすくなったのですがE&Cを有効にしてトレースを行うとトレース時の反応速度がかなり劣化するのを感じます。
私のPCが非力なのでしょうか? 私の使用しているPCはDELLのWorkstationで周波数が2Ghzを越えたCPUを搭載しておりメモリも1024MB搭載してスワップは殆ど発生していないですから決して非力とは思えないんですけどね。
β2であることを割り引いて評価をしていますがRCになってもこのままだと正直C#のE&Cは使いたくないなと思っています。