c#とaop

22
C#とAOP F# C#の素晴らしさを語る会 @Posaune

Upload: hiroshi-maekawa

Post on 01-Jul-2015

2.732 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: C#とaop

C#とAOP

F# C#の素晴らしさを語る会

@Posaune

Page 2: C#とaop

自己紹介

Posauneです。@Posauneです。まえかわです。

C#ラブ、F#すげえ、Ruby好き、Python素敵、Powershellもっと流行れ

京都アジャイル勉強会(#京アジャ)やってます。

最近はテストとか品質とかUXとかも好きです。節操がない系エンジニア。

Microsoft MVP for VisualStudio ALM(2013/10 〜)

Page 3: C#とaop
Page 4: C#とaop

資料はさっき作りました

適宜ツッコミをすることにより初めて成立するセッションです

僕もAOPはまだまだなので、一緒に勉強しましょう!

Page 5: C#とaop

今日話さないこと

Reflectionと遅延Bindingまわり

ついでにILとの連携の話をして

それからそれの応用としてのAOPとDI

Page 6: C#とaop

今日話さないこと

Reflectionと遅延Bindingまわり

ついでにILとの連携の話をして

それからそれの応用としてのAOPとDI90%

Off

Page 7: C#とaop

Reflectionと遅延バインディング

Reflectionの説明は誰かがしてるはず

あおおにくんさん?

いしかわさん?

遅延バインディング

Activator.CreateInstance

あおおにくんさんもここに

自作DIの友

Page 8: C#とaop

DI: Dependency Injection

これ読め。

Jolt Award 2013 !

Page 9: C#とaop

さて。

Page 10: C#とaop

AOP

Aspect Oriented Programming

アスペクト指向、と呼ばれます

aspect/æ ́spekt/

語源は「目に見えるもの(spect)」〗

(物事の)側面, 局面, 面; 様相; (物事を見る)観点, 角度

Page 11: C#とaop

アスペクト指向プログラミング

オブジェクト指向ではうまく分離できない特徴(クラス間を横断 (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)

Page 12: C#とaop

要するにアスペクトって?

複数のクラスやメソッドにまたがる横断的感心事

オブジェクト指向で分析すると、どうしてもコードクローンを生んだりしやすくなってしまう。

Page 13: C#とaop

例えば

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"); } }

オブジェクト分析をしても切り出すのは難しい

Page 14: C#とaop

アスペクト指向だと… 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); } }

主機能 アスペクト

Page 15: C#とaop

C#とAOP

AOPを実現するために必要なこと

メタプログラミング

アセンブリへの介入

ビルドプロセスへの介入

ランタイムでやってもいいけど遅い

Page 16: C#とaop

メタプロといえば

Page 17: C#とaop

怖いのでライブラリに逃げましょう

商用

PostSharp

OSS

Fody

Page 18: C#とaop

Fody

オープンソースのAOPフレームワーク

ビルドプロセスに介入し、PostBuildイベントでバイナリを書き換える

どう書き換えるか、の実装は自分次第

Mono.Cecilを使ったIl.Emit祭り

ILSpyとお友達♪

今日はやりませんが、ここまで低レベルに落ちれるのもC#の魅力ではあります

Page 19: C#とaop

XXX.Fody

Fodyにはすでにいくつも補助ライブラリが出ている

メソッドの実行時間ロギング

IDataErrorの自動実装

IDisposableに自動実装

Page 20: C#とaop

デモ

誰もが面倒くさいと思っていることの自動実装

Page 21: C#とaop

まとめ

C#でもAOPできます

簡単にやるならFodyのありあわせを使うかPostSharp

こるならFodyは楽しい

C#は低レベル実装もかなり自在に触れる

意外にメタプロ耐性あるんですよ

Page 22: C#とaop

C#