C#とaop
-
Upload
hiroshi-maekawa -
Category
Documents
-
view
2.731 -
download
0
Transcript of C#とaop
![Page 1: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/1.jpg)
C#とAOP
F# C#の素晴らしさを語る会
@Posaune
![Page 2: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/2.jpg)
自己紹介
Posauneです。@Posauneです。まえかわです。
C#ラブ、F#すげえ、Ruby好き、Python素敵、Powershellもっと流行れ
京都アジャイル勉強会(#京アジャ)やってます。
最近はテストとか品質とかUXとかも好きです。節操がない系エンジニア。
Microsoft MVP for VisualStudio ALM(2013/10 〜)
![Page 3: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/3.jpg)
![Page 4: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/4.jpg)
資料はさっき作りました
適宜ツッコミをすることにより初めて成立するセッションです
僕もAOPはまだまだなので、一緒に勉強しましょう!
![Page 5: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/5.jpg)
今日話さないこと
Reflectionと遅延Bindingまわり
ついでにILとの連携の話をして
それからそれの応用としてのAOPとDI
![Page 6: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/6.jpg)
今日話さないこと
Reflectionと遅延Bindingまわり
ついでにILとの連携の話をして
それからそれの応用としてのAOPとDI90%
Off
![Page 7: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/7.jpg)
Reflectionと遅延バインディング
Reflectionの説明は誰かがしてるはず
あおおにくんさん?
いしかわさん?
遅延バインディング
Activator.CreateInstance
あおおにくんさんもここに
自作DIの友
![Page 8: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/8.jpg)
DI: Dependency Injection
これ読め。
Jolt Award 2013 !
![Page 9: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/9.jpg)
さて。
![Page 10: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/10.jpg)
AOP
Aspect Oriented Programming
アスペクト指向、と呼ばれます
aspect/æ ́spekt/
語源は「目に見えるもの(spect)」〗
(物事の)側面, 局面, 面; 様相; (物事を見る)観点, 角度
![Page 11: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/11.jpg)
アスペクト指向プログラミング
オブジェクト指向ではうまく分離できない特徴(クラス間を横断 (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](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/12.jpg)
要するにアスペクトって?
複数のクラスやメソッドにまたがる横断的感心事
オブジェクト指向で分析すると、どうしてもコードクローンを生んだりしやすくなってしまう。
![Page 13: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/13.jpg)
例えば
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](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/14.jpg)
アスペクト指向だと… 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](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/15.jpg)
C#とAOP
AOPを実現するために必要なこと
メタプログラミング
アセンブリへの介入
ビルドプロセスへの介入
ランタイムでやってもいいけど遅い
![Page 16: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/16.jpg)
メタプロといえば
![Page 17: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/17.jpg)
怖いのでライブラリに逃げましょう
商用
PostSharp
OSS
Fody
![Page 18: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/18.jpg)
Fody
オープンソースのAOPフレームワーク
ビルドプロセスに介入し、PostBuildイベントでバイナリを書き換える
どう書き換えるか、の実装は自分次第
Mono.Cecilを使ったIl.Emit祭り
ILSpyとお友達♪
今日はやりませんが、ここまで低レベルに落ちれるのもC#の魅力ではあります
![Page 19: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/19.jpg)
XXX.Fody
Fodyにはすでにいくつも補助ライブラリが出ている
メソッドの実行時間ロギング
IDataErrorの自動実装
IDisposableに自動実装
![Page 20: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/20.jpg)
デモ
誰もが面倒くさいと思っていることの自動実装
![Page 21: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/21.jpg)
まとめ
C#でもAOPできます
簡単にやるならFodyのありあわせを使うかPostSharp
こるならFodyは楽しい
C#は低レベル実装もかなり自在に触れる
意外にメタプロ耐性あるんですよ
![Page 22: C#とaop](https://reader036.fdocument.pub/reader036/viewer/2022062320/55934a1d1a28ab16568b4710/html5/thumbnails/22.jpg)
C#