「横断的関心事」の問題
横断的関心事: 従来のモジュールが対応で きない関心事
他のモジュールに少しずつ変更を加える必要あ り
例 : 名前が set で始まるメソッドの呼び出
しを記録 Class Line setColor
アスペクト指向の実現方法
従来のモジュール単位ではまとめられなか ったものを,
アスペクトにどのようにまとめるか ?
できるだけモジュール間の依存関係を減らした い
コンパイラがプログラムを組み立てるルールが 必要
Join Point Model の導入
Join Point Model
Join Point: プログラム中の特定の実行時点
プログラムの実行を「 Join Point の列」として とらえる
メソッド呼び出し,フィールドの参照,更新, ...
Join Point
の決め方が言語の特性を決めるアスペクトの記述方法
アスペクト = 「いつ,何をするか」 で処理を記述
pointcut:
イベント(join point)
の集合advice: pointcut
に対応させる手続きPointcut
の直前に処理を追加するPointcut
の直後に処理を追加するPointcut
の代替の処理を実行する(本来の処理を回避する)advice
の呼び出しは,コンパイラ・インタプリタが自動で埋め込む
メソッド呼び出しが,対象のプログラム側に出現しない
アスペクトは,他のクラスにメンバーを追加してよい
クラス階層で関係のないクラスにも同じメソッドをまとめて 定義できる
「図形の移動が起きたら画面を更 新」の例
「図形の移動」というイベントは メソッド呼び出し
Line.setP1, Line.setP2,
表明
アスペクトを用いた表明の書き換
事前条件,事後条件は,アスペクトとして書 え
きやすい
「メソッド呼び出しの直前と直後に条件を検 査」という
簡潔なルールによって記述が可能
AspectJ pointcut sqrt_call(int x): call(double aClass.sqrt(int)) && args(x); による実装例
before(int x): sqrt_call(int x) { assert( x >= 0 );
}
言語要素の検討 : Join point
Join Point Model
AspectJ
のJoin Point Model
を採用AspectJ
のモデルはメソッド呼び出しなど,実行時のイベントに基づく
「メソッド呼び出しの前後」が表明の検査が一番多いタイミング
Pointcut: Join point の選択に使える述語
call pointcut
が主体Context exposure
も重要Context exposure:
呼び出しなどの時点でのオブジェクト,引数へのアクセスを提供する仕組み
AspectJ
におけるthis, target, args pointcuts
制御フローの
cflow pointcut
などの効果の検討は今後の課題アドバイスとインタータイプ宣言
Advice
assert
文を書くのが主な目的1つの呼び出しに対して,事前・事後条件がペアで付 く
両方をペアで書けるように言語を用意
AspectJ
ではbefore/after
と個別で実現されるインタータイプ宣言
表明の記述に必要なメソッド・フィールドの定義
オブジェクトに,中間状態の保存用のフィールドの追加 データ集計用のメソッドの追加
表明 「専用」 であることが明示される