Q. AspectJではローカル変数や行番号に基づくポイントカットが使えないのか

(この疑問は,AspectJ が発表された直後の時期にメーリングリストで出されたものです.)

たとえばロギングでローカル変数への代入などを記録したいと考えたとき, アスペクトを使ってみたいが,使えないのか.

A. 利点が不明瞭で,しかも問題のほうが多いと判断されたため,使えない.

ロギングの例などから, メソッド内部のすべての変数の受け渡しなどをアスペクトで調べたい, といった要望が出てきたためかとも考えられます.

これに対して,Erik Hilsdale は次のように説明しています.

We feel that any such pointcut would lead to extremely error prone code;
programmers expect to be able to rename local variables at will,
and to refactor the internals of methods at will.

変数名はメソッドの内部実装に大きく依存するため, ローカル変数の名前を変えただけでプログラムの挙動が変わるのは 危険だと判断しているようです.

また,Robin Green は,次のような, 2つの同名の変数が定義されるサンプルコードを示し, これらの変数をうまく区別する方法が無いと指摘しました.

if (foo) {
  String x = "x";
  ...
}
else {
  String x = "y";
  ..
}

同様に,行番号によって「何行目が実行される直前に」といったアドバイスを 定義できないか,という質問があったのですが,これに対して, Erik Hilsdale は次のように答えています.

This is not because it's particularly hard to implement.  
Rather, we believe it would lead to unmaintainable code.  
Programmers expect to be able to change the whitespace of 
their Java code without semantic consequences.  
This is the same reason we do not provide pointcuts picking 
out join points based on local variable names.

レイアウトを変更しただけでプログラムの動きが変わるのは問題だ,ということです.

行番号ポイントカットは,AspectJ では採用されませんでしたが, デバッグ用コードをアスペクトとして記述することを目的とした Bugdel プロジェクト(http://www.csg.is.titech.ac.jp/~usui/bugdel/)で 導入されています. Bugdel は,アスペクトの利用をデバッグ用途に限定しており, 「何行目をプログラムが実行する前に変数の状態を検査」といった 処理を行なうために,行番号を選択できるようにしています. 行の位置を開発者がエディタ上で明示的に指定すること, また,ソースコードの編集によって行がずれた場合には 統合開発環境(Eclipse)が自動でアスペクト側を変更するということで, レイアウト変更への対応を行なっています.

参考文献

上記で紹介したメールについては, users@aspectj.org メーリングリストのアーカイブを参考にしてください. http://www.eclipse.org/aspectj/resources.php から,ZIPアーカイブでダウンロードすることができます. Erik Hilsdale のコメント,Robin Green のコードは,次のメールに含まれています.

Robin Green の指摘
  Message-ID: <F136R9Odutox7nyeKzG000080bb@hotmail.com>
Erik Hilsdale のローカル変数についての言及
  Message-ID: <m3g0avq1xc.fsf@localhost.localdomain>
Erik Hilsdale の行番号ポイントカットについての言及
  Message-ID: <839BE2CA5177D3119C7000508B11F5DB02612894@dagobah.parc.xerox.com>


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-01-10 (火) 14:49:20 (4640d)