c#とaop
TRANSCRIPT
C#とAOP
F# C#の素晴らしさを語る会
@Posaune
自己紹介
Posauneです。@Posauneです。まえかわです。
C#ラブ、F#すげえ、Ruby好き、Python素敵、Powershellもっと流行れ
京都アジャイル勉強会(#京アジャ)やってます。
最近はテストとか品質とかUXとかも好きです。節操がない系エンジニア。
Microsoft MVP for VisualStudio ALM(2013/10 〜)
資料はさっき作りました
適宜ツッコミをすることにより初めて成立するセッションです
僕もAOPはまだまだなので、一緒に勉強しましょう!
今日話さないこと
Reflectionと遅延Bindingまわり
ついでにILとの連携の話をして
それからそれの応用としてのAOPとDI
今日話さないこと
Reflectionと遅延Bindingまわり
ついでにILとの連携の話をして
それからそれの応用としてのAOPとDI90%
Off
Reflectionと遅延バインディング
Reflectionの説明は誰かがしてるはず
あおおにくんさん?
いしかわさん?
遅延バインディング
Activator.CreateInstance
あおおにくんさんもここに
自作DIの友
DI: Dependency Injection
これ読め。
Jolt Award 2013 !
さて。
AOP
Aspect Oriented Programming
アスペクト指向、と呼ばれます
aspect/æ ́spekt/
語源は「目に見えるもの(spect)」〗
(物事の)側面, 局面, 面; 様相; (物事を見る)観点, 角度
アスペクト指向プログラミング
オブジェクト指向ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「アスペクト」とみなし、アスペクト記述言語をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試み。
(wikipediaより http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
要するにアスペクトって?
複数のクラスやメソッドにまたがる横断的感心事
オブジェクト指向で分析すると、どうしてもコードクローンを生んだりしやすくなってしまう。
例えば
class ClassA { public void MethodA() { Console.Write("Enter Class A - Method A");
// Do Something
Console.Write("Exit Class A - Method A"); }
public void MethodB() { Console.Write("Enter Class A - Method B");
// Do Something
Console.Write("Exit Class A - Method B"); } }
class ClassB { public void MethodC() { Console.Write("Enter Class B - Method C");
// Do Something
Console.Write("Exit Class B - Method C"); } }
オブジェクト分析をしても切り出すのは難しい
アスペクト指向だと… class ClassA { [LoggingTarget] public void MethodA() { // Do Something }
[LoggingTarget] public void MethodB() { // Do Something } }
class ClassB { [LoggingTarget] public void MethodC() { // Do Something } }
class LoggingIntercepter : Intercepter { public override void OnEnter(MethodInfo info) { Console.Write("Enter {0} - {1}", info.DeclaringType.Name, info.Name); }
public override void OnExit(MethodInfo info) { Console.Write("Exit {0} - {1}",info.DeclaringType.Name, info.Name); } }
主機能 アスペクト
C#とAOP
AOPを実現するために必要なこと
メタプログラミング
アセンブリへの介入
ビルドプロセスへの介入
ランタイムでやってもいいけど遅い
メタプロといえば
怖いのでライブラリに逃げましょう
商用
PostSharp
OSS
Fody
Fody
オープンソースのAOPフレームワーク
ビルドプロセスに介入し、PostBuildイベントでバイナリを書き換える
どう書き換えるか、の実装は自分次第
Mono.Cecilを使ったIl.Emit祭り
ILSpyとお友達♪
今日はやりませんが、ここまで低レベルに落ちれるのもC#の魅力ではあります
XXX.Fody
Fodyにはすでにいくつも補助ライブラリが出ている
メソッドの実行時間ロギング
IDataErrorの自動実装
IDisposableに自動実装
デモ
誰もが面倒くさいと思っていることの自動実装
まとめ
C#でもAOPできます
簡単にやるならFodyのありあわせを使うかPostSharp
こるならFodyは楽しい
C#は低レベル実装もかなり自在に触れる
意外にメタプロ耐性あるんですよ
C#