Aspects, Policies, and Configurations

特定のメソッドによっては、引数の値(true とか false)によって、そのメソッドの振る舞いが変化するのようなものが存在する。


アプリケーションによっては、常に特定の構成(常に true でいいとか、あるいは、false でいいとか)でかまわない場合があるかもしれない。


そのような場合に、アスペクトを適用するのは適切だろうか? 動機としては、問題ないように思える。なぜなら、そのようなアプリケーション全体に影響する要求(常に true でいいとか、あるいは、false でいいとか)は、横断的関心事だと思われるから。


しかしながら、適切でないかもしれない、と思ってしまう理由もある。一つは、コードを見ただけでは、そのようなアスペクトによって適用されたポリシーが分からないため。この問題は、今考えているようなケース以外にも当てはまる AOP における一般的な問題だと思うけど、やはり気になる点ではある。


具体的な例としては、QDox の JavaMethod クラスの、getTagByName メソッド が当てはまる。


コード例としては


public aspect TagPolicy {

DocletTag around(JavaMethod method, String name) :
args(name) &&
target(method) &&
call( DocletTag JavaMethod.getTagByName(String) )
{
return method.getTagByName(name, true);
}
}

のような感じ。


少し話はずれて、上記のコードでやりたいのは、コードをインターセプトすることでは なく、どちらかというと、元々のメソッドの実装をオーバーライドしたいということを意図しているとも表せるため、上記のようなポイントカットの書き方は、プリミティブすぎると感じなくもない。つまり、以下のように書けるのはどうか?


public aspect TagPolicy {

override DocletTag JavaMethod.getTagByName(String name) {
return getTagByName(name, true);
}
}

簡潔だと思う。