Inter-type Pointcuts

inter-type 宣言(or オープンクラス [1])が面白いのは、外部から、特定のモジュールを変更できること。AspectJ では、たとえば、外部からあるクラスにあるインタフェースを implements させたり、あるいは、外部からクラスに特定のメソッドやフィールドを追加したりできる。それによって、クラスの構造はよりシンプル(or 特定の要求を実装するためのメソッドなどを実装する必要がなくなる)になり、再利用性の向上もありえると思う。あるいは、プロダクトライン開発 [2] にも有効かもしれない。


現在の AspectJ では、ポイントカットの外部からの導入やアドバイスの導入はクラスと同じようにはできない。


public aspect MyAspect { }
public aspect YourAspect {
pointcut MyAspect.pc() : ... // こういうのは無理。
}

もう一つ無理なのは、ポイントカットを外部から変更すること。たとえば:


public aspect Logging {
pointcut set() : call( void Point.set*(..) );

before() : set() {
// ... ログ
}
}

とかがあって、Point クラスだけじゃなく、Line クラスのsetメソッドのログも行いたいとしたら? 現在の AspectJ の実装では:

public aspect Logging {
pointcut set() : call( void (Point || Line).set*(..) );

before() : set() {
// ... ログ
}
}

のように、ソースを直接変更するしかない。しかし、もし、Logging が再利用可能なアスペクトだとして、ソースが手に入らないとしたら、どうすればよい?


疑問は:

  • このようなケースはどのくらいありえるのか?(少なくとも、僕は、今日これに似た状況に出くわした)
  • どのようにして、ポイントカットの intet-type 宣言を書けばよい? 現在のポイントカットの書き方だと、ちょっと表現の仕方が難しいように思える。

関連:

[1]
The MultiJava Project
http://multijava.sourceforge.net/

[2]
Don Batory, Jia Liu, Jacob Neal Sarvela.
Refinements and Multi-Dimensional Separation of Concerns.
ACM SIGSOFT 2003 (ESEC/FSE2003). (2003)

DL: http://www.cs.utexas.edu/users/schwartz/pub.htm
他にも、僕はまだ読んでいないけど

Don Batory, Jacob Neal Sarvela, Axel Rauschmayer
Scaling Step-Wise Refinement
International Conference on Software Engineering (ICSE-2003), Portland, Oregon.

DL: http://www.cs.utexas.edu/users/schwartz/pub.htm