倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

反復シミュレーションに対する JoinPoint

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

です。

f:id:waman:20071219104208p:image

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プログラミングへ

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ

*1:アスペクト指向プログラミングでいうジョインポイント。

*2:もしくは、セットされている Iteration オブジェクトの iterate() メソッドを呼び出す。