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);
}
}