2012年08月17日

アスペクト指向で調べること終了のお知らせ

ほんの一瞬だけ起きた俺のアスペクト指向ブーム早くも終了

なんか、Aspect.netみたいなのないの?っていうの探し続けてたんだけど
色々あって大して有用でもないから消えちゃったみたいだね。

 
C#でAOPっぽいことができる方法は3つくらいあるらしい

↓参考
http://d.hatena.ne.jp/Kazzz/20050527/p1

  • ContextBoundObjectとContextAttribute属性を利用する(Annotation 方式)
  • ReflectionとMSILのEmitionによる型の動的な生成を利用する(TypeEmition 方式)
  • Realproxy派生クラスによるメソッドインターセプションを利用する(Proxy方式)


Annotation方式は、使用される側のオブジェクトをContexeBoundObjectクラスの派生クラスとして定義し、ロギングなど処理を差し込みたいメソッドに属性をつけとくというもの。
属性をつけておけばアスペクト差し込めるっていうのは素直でいいんだけど、なにせ差し込み先がContextBoundObjectクラスの派生にシなきゃいけないっていうのが美しくない上に重い。

っていうか元々ContextBoundObjectっていうものは、リモートオブジェクトの操作を想定していたものらしく
普通のメソッド呼び出しの1000倍くらい時間かかるとのこと。
↓参照
http://hogetan.blog24.fc2.com/?mode=m&no=2
だめだこりゃ。

TypeEmition方式は自分で.NETの中間形式を組み立てるものらしい。JavaでいうところのJBossのアプローチに近い?
正直、自分のちょっとした自作プログラムにこんな大規模なものを作りこむ気がしないです。。。
誰かがこれを元にした汎用的なAOPフレームワークを作ってくれたら利用したいな、くらい。

Proxy方式は、色々なサイトで一番手軽で使いやすいAOP実現方式だって言われているヤツ。
アスペクト差し込み元をRealProxyの派生クラスとして実装し←差し込み元に制限があるくらいは認めてもいいかも
差し込み先はMarshalByRefObjectクラスの派生クラスとして実装する←結局それかよ!

で、差し込み先を利用する場所で、new 差し込まれクラス() の代わりに 差し込みクラス.CreateTarge<差し込まれクラス>() を使ってインスタンスを作成するといけるらしい。
こういうわけなので、コンストラクタにはアスペクトを差し込めない。

うーん・・・

TypeEmition方式以外は、なんだかんだ制限があって、俺の想定どおりのプログラミングは実現困難だなあ。

解説しよう[俺の想定通りのプログラミングとは]

ロギングも何も全く考えないプレーンなクラスを作成、完成直前に「ここにログいれてえなあ」と思ったら後からアスペクトを追加することでなんと自然にログ埋め込みがなされたクラスができてしまう!元のソースは綺麗で俺の思考が素直にコードになってるだけ。素晴らしい!

でも色々なクラスを派生しなきゃいけないんでしょ?クラスの派生って一つしかできない特権的な存在なのにそれを奪われるとか。

で、そんなこんなでアスペクトは諦めた。っていうかこういう色々な制限がうっとおしくて、世の中の人は普通にコードにログを埋め込んでいたのね。
一時期、DIとかでAOP流行ったらしいんだけど、WebフレームワークはほとんどRailsっぽいものに乗っ取られたらしいしね。
そのRubyでもAOPはやってないし。AspectJも盛り上がりを見せないし。

ふむ、俺もしばらくはコードにログを埋め込む生活にもどるか。
posted by LoyalTouch at 07:36| Comment(0) | TrackBack(0) | プログラム全般 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック