AspectJ5でmemorization

memorizationは、プログラムで特定の入力組に対し関数実行の結果をキャッシュしておいて、同じ入力組が来たときにそれを再利用するテク。キャッシュを使うときは関数を実行しないので、副作用があると振る舞いが変わる。

これを元のコードをなるべく置き換えずにやれるのが、よいmemorization機能と。

Javaの場合、annotationを使ってヒントを与えて、それを外部からメモ化させるのがよいかもしれません:

public @interface Memorize {}
public class Fib {
  @Memorize
  public int fib(int n) {
    if (n < 2) return 1;
    return fib(n-1)+fib(n-2);
  }
}

ってかけて、これが実際にメモ化できればいいでしょう。

こういうのはAspectJ5でやるのがいいとは思うけど、正直aspectコードは複雑になりそう。そもそもこういう汎用のってできるのかな。annotationサポートの場合、こういうタイプのAspectが多くなりそうではあるが。

やりたいこと

  • 「@Memorizeつきメソッドを持つ」インスタンス、@Memorizeつきメソッド、引数と解とのマッピングをつける
  • 「@Memorizeつきメソッド」で、インスタンス、メソッド、引数と対応する結果が対応するマップに解があればそれを返し、なければproceedしその解をマップにいれてから戻るadvice

たったこれだけだけど、こういうのってAspectJだと以外とめんどい。

AspectJ5のノート:

AspectJ5 のM3出てますね。