WPFを中心に書いています。Technologies。qiita.com空いたままだったのが忍びなく埋めようと書いた記事なので、完成まで到達できていませんがその辺はご容赦ください。予定では25日の本チャン?までには完成する...といいな?的な?ところでみなさんAOPしてますか?Xamarin界隈では、あまり取り組まれていないイメージが個人的にはありますが、やはりiOSで動的コード生成がNGで選択肢が限られるのがネックなんでしょうか?という訳で、AOP絡みの調査を少ししてみてました。Programmingの略です。日本語だとアスペクト指向プログラミングなんて言われますね。いうと、オブジェクト指向を捨てるのね!酷いわ!と思われるかもしれませんが、AOPはオブジェクト指向プログラミングとは直行する概念で、オブジェクト指向の苦手な部分を補強する概念になります。ちなみに直行する概念てIT関連では稀に良く見かけますが、分かりにくい表現ですよね。間違ってるかも知れませんが私は次のようにとらえています。いった「機能要件」を実現することに主眼を置いています(もちろん、それだけだと限定するものではありません)。非機能要件とされる関心事が多めです。これらの複数の機能から横断的に必要とされる関心事をアスペクトとしてとらえ、分離・記述し、必要とされる機能へ織り込む(Weaving)ことで機能に対して非機能を付与する考え方が、アスペクト指向プログラミングです。これらはOOPでは実現できないという訳ではありません。OOPとAOPを組み合わせることで、よりシンプルに実現できるということです。文字で解説しても伝わり難いでしょうから、コードを見てもらいましょう。サンプルは諸事情によりコンソールアプリです。足し算をするCalculatorクラスを作ります。}}そして呼び出す側です。}}目標はAddメソッドの前後に引数と戻り値をログ出力するアスペクトを織り込む事とします。CoreのDynamicProxyを利用します。メソッドを実行前後でログ出力するインターセプターを作成します。}IInvocationがインターセプトした実行対象を抽象化したオブジェクトで、Proceedメソッドを呼ぶことで元々呼び出された処理を実行します。ご覧の通り、呼ばないで処理を代替することも可能です。織り込み(Weaving)ましょう。先ほどのProgramクラスのCreateCalculatorメソッドを次のように修正しましょう。Interceptor());}こうすることでCalculatorクラスを継承したプロキシークラスが動的に生成されます。実際に生成されるクラスを見てみましょう。Casle.Proxies.CalculatorProxyというクラスが動的に生成されていることが見て取れるでしょう。実行結果が次の通りです。2ReturnValue:33ロギング処理が織り込まれていることが見て取れますね!最後の行の「3」はreturnした後に、呼び出し元でConsole.WriteLineしているので想定通りです。XamarinでAOPってどうするの?上の例では簡単なロギング処理でしたが、共通する例外処理やトランザクション処理を都度コードに記載しないで済むことは非常に魅力的ですよね。実装工数だけではなく、コードの見通しが良くなりメンテナンス性も高まりますし、テストも省略する事が可能です。便利ですよね!Xamarinでもやりたい!ぜひ!!しかしXamarinでは一筋縄ではいきません。すべてはiOSが動的コード生成を許可していないのが悪いのです。(プンスカ!Casle.Coreの依存関係をNuGetで見てみましょう。https://www.nuget.org/packages/Castle.CoreSystem.Reflection.Emitさんがいらっしゃいますね...Xamarin.iOSの公式ドキュメントでも非対応だよとちゃんと記載があります。https://developer.xamarin.com/guides/ios/advanced_topics/limitations/#No_Dynamic_Code_Generationぐぬぬぬぬ....NETでAOPを実装する代表的な手法の一つにRealProxyクラスを利用する方法がありますが、これも動的コード生成しているので動くわけがありません。blogAOPをやるとなると、方式的には大きく二つに分けられます。設計と実装ルールによる制約で疑似AOPを実現する1.はXamarin.iOSでは全滅ですし、3.は最後の手段です。なるとILを弄りたくなります。(自分の能力で)できるかどうかは別として...ILを弄る系のAOPフレームワーク、実は結構触ったことはあるって人多いんじゃないでしょうか?一時期話題になっていましたし。PropertyChanged.Fodyです。今年ちょっと話題になっていた記事はこちらでしたっけ?10.hateblo.jpもちろん現在でも正しく動きます。PropertyChanged.FodyはINotifyPropertyChangedの実装を容易にするためだけのものですが、そもそもこれのベースであるFodyはILを操作してAOPを実現するための基盤フレームワークです。PropertyChanged.Fodyの姉妹品にMethodDecorator.Fodyがあります。こいつはメソッドのインターセプトに対応しています!!おお!!!しかしXamarinで動きません。2017でそもそも動かない気がします。したらいいの!!答え:作るしかないよねという訳で作りたいと思いますが、現在絶賛苦戦中です。現状の課題は次の通り。Standardの不具合ぽいんですが対処方法が上手くいったり行かなかったりで良く分かりませんILワカンネ特に3番目は致命的な気がしますが、25日までに少しは希望が見えてくるといいなあと、夢を見ています。7日目がまだ埋まっていませんので、よかったら誰かよろしくお願いします。Containerの比較記事を見つけた英語のブログですが良さげな比較記事を見つけました。(1)はてなブログをはじめよう!nuitsjpさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。