OPS フレームワークでは、物理シミュレーションの中でも「反復シミュレーション」に限定しているので、事前処理・事後処理を行うタイミング*1もある程度限定することが出来ます。 そこでメソッドに「@Prepare(...)」「@Dispose(...)」というアノテーションを付加して、それぞれ事前処理・事後処理であることを明示することにしましょう。 「...」の箇所には、タイミングを指定する JoinPoint オブジェクトを指定します。
JoinPoint には、今のところ次の3つが指定できます:
- SIMULATE:IterativeSimulator#simulate() の実行(の前後)
- ITERATE:Iteration#iterate() の実行(の前後)
- EVOLVE:Iteration#evolve() の実行(の前後)
実際どのように織り込まれるかは、以下の「概念図」もしくは「AspectJ 風に書くと・・・」を参照のこと。
概念図
処理の流れに「@Prepare」「@Dispose」の処理を織り込んだ、シーケンス図風の図を書いておきましょう。 注意点は
- IterativeSimulator#simulate() はセットされている Iteration オブジェクトの iterate() メソッドを呼び出す
- Iteration#iterate() は反復条件が満たされている間、Iteration#evolve() を呼び出す
- Iteration#evolve() はセットされている PhysicalSystem オブジェクトの evolveState() を呼び出す*2
です。
AspectJ 風に書くと・・・
「処理を織り込む」という意味では、AspectJ を用いて書くとある程度正確に定義できるかと思うので、実装例を載せておきます。 それぞれで「call ポイントカットと execution ポイントカット」、「try 〜 catch 文の有無」などの違いがありますが、仕様か実装例かは今のところ確定してません。
void around(): execution(* IterativeSimulator.simulate()){ try{ // @Prepare(JoinPoint.SIMULATE) の処理 proceed(); }finally{ // @Dispose(JoinPoint.SIMULATE) の処理 } }
void around(): execution(* Iteration.iterate(PhysicalSystem)){ try{ // @Prepare(JoinPoint.ITERATE) の処理 proceed(); }finally{ // @Dispose(JoinPoint.ITERATE) の処理 } }
void around(): call(* Iteration.evolve(PhysicalSystem)){ // @Prepare(JoinPoint.EVOLVE) の処理 proceed(); // @Dispose(JoinPoint.EVOLVE) の処理 }
アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ
- 作者: 千葉滋
- 出版社/メーカー: 技術評論社
- 発売日: 2005/11/18
- メディア: 単行本
- 購入: 4人 クリック: 54回
- この商品を含むブログ (40件) を見る