アスペクト思考

「指向」の間違いじゃなく、アスペクトなプログラム「思考」の話。


アスペクト指向が取り組む問題は、横断的関心事のモジュール化にある(僕が決めたんじゃなくて、一般的な話)。横断的関心事は、一般的には、二つの状況を表す:

  • コードのちらばり: ある機能が、複数のモジュールに影響する。
  • コードのからまり: ある機能とその他の機能が、同時にからまった状況になる。

AOP では、横断的関心事をアスペクトというモジュール単位にカプセル化できるような言語機構を導入することでこの問題に取り組む。


AspectJ を使ってのプログラミングに慣れてくると、アスペクト単位で機能が表されていることの利点が感じられるようになる。物理的に横断的関心事がモジュール化されているという意味での利点だけではなく、プログラムの構成を考えるときに、その考えが直接アスペクトの単位で表せる点が利点に感じられる。


たとえば、アプリケーションの実行時間を計りたいとして、普通の Java だとたぶんこういう感じになると思う:


public class Main {
public static void main(String[] args) {
... // 実行開始時刻の測定
... // main のプログラム
... // 実行終了時刻の測定
}
}

一方、AspectJ では:


public aspect TimeLogging {

void around() : execution( void Main.main(String[]) ) {
... // 実行開始時刻の測定
proceed();
... // 実行終了時刻の測定
}
}

public class Main {
public static void main(String[] args) {
... // main のプログラム
}
}

となる。


アスペクトを導入することの欠点は、プログラムの実行の流れがやや把握しにくくなる(上の例では、Main クラスだけを見ても、実際にプログラムがどう動作するのか分からない)ことだと思うけど、これが本当に欠点だけなだけがどうかはやや微妙に思える。


特定の機能(上の例では、時間の測定)の存在を意識しなくてもすむ、というのは、プログラムの理解の点からは、やや優しさを感じる。つまり、特定のアスペクトを使って機能を分離することにより、プログラミングする上での思考の軽減になると感じている。これは、オブジェクト指向(思考)での、ポリモーフィズムなどにも通じる現象かもしれない。ある部分を気にせずにすることにより、コードを読む上での精神的な負担が減ると思う。この負担の削減は、思っていたよりも、効果的に感じる。