アスペクト指向の世界観です。
アスペクト指向とは、複数のクラスを横断する「横断的関心事」と呼ばれる処理を、ひとつの「アスペクト」と呼ばれるモジュールに記述することのできるプログラミングパラダイム。
従来のオブジェクト指向では、複数のクラスで同一の処理を行う場合、処理を「実行する場所」に書かなければならない。
そのため、たとえば「全てのメソッドでログをとりたい(ロギング)」と言った場合に、それぞれのメソッドにロギングのコードを記述することが必要になる。
これでは、「ロギングの処理を変えたい」といった時に、全てのコードの処理を書き換えなければならない。
アスペクト指向では、そうした処理をアスペクトと呼ばれる外部のモジュールにまとめ、アスペクトの側で「このクラスとこのクラスのメソッドが実行される時」といったように「時」を指定してやることで、コードをまとめて編集しやすくする。
AspectJは、「ジョインポイント」と呼ばれる方式によるアスペクト指向言語で、Javaに対する拡張となっている。
以下は、上記のページの中のコードの解説。一部のキーワードは書き換えてあります。
まず、
aspect HogeAspect {}
でアスペクトの宣言を行う。そして、
before() : execution(void HogeClass.*()) {}
このうち、「before() : 」は、「このイベントが発生する前に実行せよ」というキーワード。そして「execution(void HogeClass.*())」により、クラスHogeClassのメソッドが実行される時点のポイントカットを行う。ジョインポイント方式では、イベントの述語を捕らえることを「ポイントカット」と呼ぶ。最後に、
hoge_logger.log()
で、ロギングの手続きを関連付ける。これを「アドバイス」と呼ぶ。
また、AspectJは@をつかった注釈(アノテーション)を使うことでもっと綺麗で美しいアスペクトの書き方がある。
@before("execution(public * fuga(..))")
以下のページが参考になる。
2023.02.08編集
Spring Frameworkは、Javaの独自のアスペクト指向かつMVCに基づくフレームワークとして知られる。Spring Frameworkを参照のこと。
AspectC++はC++におけるアスペクト指向の拡張。
AspectRはRubyにおけるアスペクト指向の拡張。
Pythonでは、デコレータという機能を使うことで、処理の前後に行う処理を複数のメソッドに適用することができる。Python入門(8.その他)を参照のこと。