Aspect指向についてちょっと

はぎわらくん様のSPLC参加日記Aspect指向とSPLの関係の重要性に注目しておくべきだという話が最近多いように見える。ただ、残念ながら、世間ではAspect指向=AspectJ=ログだ。Aspect指向というと、メソッド実行や例外ハンドリングの時のログ記述をAspectで書こうって話ばかり。 これは、

  • RSVPが必ず、「社長には3000kbpsあげたい会社向けの技術
  • Webサービスが必ず「旅行代理店、それもやたらトラブルばかり起こってコンペンセーションが発生しまくる旅行ばかりする人向け技術
  • ジェネリクスが必ず「型が決まったコレクションクラスが欲しい人向けの技術

と思われているのに並んで、特定の使い道しかない技術に見られがち。この手の特定の使い道ばかり強調される技術は衰退するの法則があるので心配だ。
けど自分はAspect指向って好きだから、ちょっといいたいが、

  • Aspect指向ってもっと奥が深い技術のはず。そもそも実装よりは設計、アーキテクチャ検討向けの「考え方」のはずだと思うのだが、違うのか。フィーチャ分析と非常に相性がいいと思うのだがなあ。ってなんとなくしか考えてないが。
  • あとね、ログにいいかというと、絶対おかしいと思うぞ。現在のAspectJでは言語仕様に依存した粒度や構文でしかPointcutを記述できない(メソッド宣言単位とか例外ハンドリング単位とか)。けど、SIの商用のプログラムを見ればわかるが、まず、ログはメソッドとか例外とか言語使用レベルより細粒度のログを書く。ほとんどステートメント単位でのログを全部記述するし、そのためのログ記述のほうがあっというてきに多い。そして、ログで吐かせたい情報がどのようなものかは言語の構文からだけでは決定できない。つまり実際のメソッド内のコンテキスト、直前のステートメントなど構文でなくステートメントの意味を見れなくては本来吐かせたいログなんか記述できないのだ。おまけに、商用プログラムとか見ると、メソッド内部にステートメントが1000行ウゲーとかそういうのもたくさんある。だから、メソッドに入りました〜出ましたなんてログを吐けるaspect定義なんか、全然意味がない
  • それでも考えられるのは、ログというよりは、保守の際のプログラム理解のために、ユースケースやら大きな粒度の機能やらが、実際に実行時にどのようなメソッドを通って動作しているかの概要をつかむリエンジニアリングに使うぐらいか。けど、それも元のクラス構造やメソッド定義の設計が良くて流れを見れば何をやっているかわかるようなものでないといけない。途中で、ステートメントが1000行もあるexecute10()とかkyoutuu3-23()とかいうメソッドに入ってしまったら、全然プログラム理解には役に立ちそうもない。要は、これもまともな設計がなされていて初めて意味が出てくる話。

どちらにしろ、AspectJは良い設計がされた実装に対して初めて意味が出てくる技術であることは間違いない。猫も杓子もAspectJでログをはいてもしょうがないと思うぞ。

というか、早くパワポ作りから開放されて家に帰りたい。。。