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
f

今日話さないこと

Of

Reflectionと遅延Bindingまわり

90
%

ついでにILとの連携の話をして
それからそれの応用としてのAOPとDI
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");

}

class ClassB
{
public void MethodC()
{
Console.Write("Enter Class B - Method C");

// Do Something

// Do Something

Console.Write("Exit Class A - Method A");

Console.Write("Exit Class B - Method C");

}

}

public void MethodB()
{
Console.Write("Enter Class A - Method B");
// Do Something
Console.Write("Exit Class A - Method B");
}

}

オブジェクト分析をしても
切り出すのは難しい
アスペクト指向だと…
主機能
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#

C#とaop