Aspectセミナー感想
昨夜、SEA関西プロセス分科会「アスペクト指向プログラミング」に行ってきました。
面白かったー。(ソフトウェアパターン勉強会よりも面白かったはず、と負け惜しみを言ってみる)
講師の小林さんと山根さんのお話は下記のように刺激的でした。
#Aspectは素人なので、おかしな箇所はご勘弁を。
【1】小林さんの話
Aspectの鳥瞰的な説明でしたが、Aspectの原論文を紹介して下さったのには驚きでした。原論文では、Lispを用いたモノクロ画像処理のプログラムが例にあげられていて、理解しやすいが処理が遅いソース、処理は速いが理解しにくいソース、Aspectを使って理解しやすく処理もそこそこ速いソースの3種類を比較してました。
Lispは詳しくないんですが、ピクセル単位の論理操作や上下操作を組み合わせて、輪郭線を抽出する機能を作るのは、CやJavaと同じ感覚で理解しやすかったです。
機能分割の構造と実行時のデータフローの構造が全然違うのは、関心事が違うからだ、という説明を受けて、Aspectの由来がようやく腑に落ちました。Javaなら、クラス図とプロファイラに相当するのかな?
簡単なサンプルとして、銀行の口座引き落としで、CommitやRollbackの保障とか、DBからSelectしたデータをキャッシュとして使い回せるようにする所にAspectを用いると、見通しが良くなると説明されてました。
ただ、いつも気になるのは、Aspectを複数混ぜ込んでしまう時、スレッドはどうなるのだろうか? 後で聞いたら、Aspect実行の順番は指定できるらしいです。でも、やはりきちんと設計しないとスパゲティになる、と飲み会で聞きました。
【2】山根さんの話
AOPを現場で使ったノウハウを惜しげもなく披露して下さって興味深かったです。
山根さんのAOP概念の下記の説明は非常に分かりやすい!
●関心・・・・・・・・・・サービスを実現する機能
●横断的関心・・・・複数のオブジェクトを跨る機能
「関心」と聞いても「機能」と何が違うのか、いつも疑問に思っていたのですが、色んな視点から切り分けた機能の関連なんですね。(小林さんの話なら、機能分割と実行データフローの違い)
「横断的関心」を機能分割する手法として、従来のオブジェクト指向では、「継承」と「委譲」が使われていますが、両方とも弱点がある、とのこと。
●継承
当たり前ですが、Javaなら多重継承できない。
●委譲
オブジェクト指向では推奨されているが、下記の弱点がある、と説明されてました。
【A】横断的関心は、概念モデルに存在しない機能(Non-functional-Consern)であることが多い。
【B】委譲にしても、結合度は比較的高い。構造化チックになる時が多い。
【C】委譲した場合、参照箇所のGrepが面倒。
非常に納得です。僕の現場の感覚では、委譲はそれほど使い勝手は良くないと思ってます。
委譲したとしても呼び出し元は元オブジェクトに残るし、引数に制御フラグがあったりして、制御結合や論理的凝集度になる時が多い気がします。だから、ソースとしては正直綺麗でない。長々と書いてくれた方がいいと思う時もあります。
僕の現場の感覚では、継承を使っている時が多いです。Webシステムなら、トランザクション制御やセッション処理、ログ出力は全てのServletに必須ゆえ、全Servletの親クラスにそれらの機能を持たせる事が多い。StrutsのActionクラスを継承した独自クラスを作り、それらを継承して業務Actionクラスを作るとか。ただ、このやり方がBestだとは皆思っていませんが、労力と保守を考えるとBetterなのかもしれません。
それから、Aspectの利点として、非機能要求(Non-functional-Consern)の開発にAOPは相性が良い、と言ってました。
確かに実際の現場では、概念モデル作成時には、トランザクション制御やログ出力は考えないから、アーキテクチャ設計をきちんとやらないと、設計時に漏れてしまう事は多い。しかも、テストしにくい難点もあります。Aspectを使えばそれらの機能を後付けすることができるわけです。
役立つ例として、System.outやprintStackTrace等をLog4jで乗っ取ってWarnigだけ出力するサンプルのデモを見たのですが、他のサンプルにもこのAspectが読み込まれてしまい、ログを見れなくなった時には、会場の皆さんも笑ってました(^^) Aspectの怖さを見せ付けられたデモでした。
他にも、SingletonはAspectで実装した方がいいというサンプルや、一時的改修にAOPでパッチを当てるという裏技の紹介もありました。現場の感覚では、AOPのパッチは怖い気がしますが。
最後に、DIやSpringの説明もありました。
感想としては、Aspectで非機能要求を実装し、オブジェクト指向で機能要求を実装するのが現在のBestな組み合わせなのかな。だから、Aspectを使って、EJBよりもお手軽な軽量コンテナを皆作りたがっているでしょうね。
AOPからしばらく目が離せません。
| 固定リンク
「日記・コラム・つぶやき」カテゴリの記事
- TwitterやFacebookは人力キュレーションツールとして使う(2022.10.02)
- 「現代病「集中できない」を知力に変える 読む力 最新スキル大全」の感想(2022.08.28)
- 人類は海辺から生まれた~水生類人猿説が面白い(2022.08.09)
- 戦前の日本人の気質はまだ成熟していない青年期と同じだった(2022.06.14)
- 物理学を攻略するためのマップ(2022.04.18)
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント