• 検索結果がありません。

「横断的関心事」の問題

横断的関心事: 従来のモジュールが対応で きない関心事

他のモジュールに少しずつ変更を加える必要あ り

例 : 名前が 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

と個別で実現される

インタータイプ宣言

表明の記述に必要なメソッド・フィールドの定義

オブジェクトに,中間状態の保存用のフィールドの追加 データ集計用のメソッドの追加

表明 「専用」 であることが明示される

Aspect for Observer

関連したドキュメント