アスペクト指向プログラミングでは、ポイントカットは結合点の集合です。ポイントカットは、関心の分離を可能にし、ビジネスロジックのモジュール化に役立つアドバイスをどこに適用するかを正確に指定します。 [ 1 ]ポイントカットは、多くの場合、クラス名またはメソッド名を使用して指定され、場合によっては、クラス名またはメソッド名に一致する正規表現を使用します。さまざまなフレームワークが異なるポイントカット式をサポートしています。AspectJ構文は事実上の標準とみなされています。Java 、Perl、Rubyなど、さまざまなプログラミング言語用のフレームワークがポイントカットをサポートしています。
さまざまなプログラミング言語の制限により、横断的関心はモジュール化されていません。横断的関心とは、論理的に1つのモジュールに属し、システム全体に影響を与えるソフトウェアの部分を指します。たとえば、セキュリティやログ記録などがこれに該当します。[ 2 ]アスペクト指向プログラミングは、プログラマが特定の時点で実行されるコードを含むアスペクトと呼ばれるモジュールを作成できるようにすることで、これらの横断的関心を解決しようとします。特定のポイントを選択するために必要な式により、ポイントカット式が作成されました。
プログラムの実行がポイントカットで定義された結合点のいずれかに到達すると、そのポイントカットに関連付けられたコード(アドバイスと呼ばれる)が実行されます。これにより、プログラマは、既に定義された動作に加えて、追加のコードをどこでいつ実行すべきかを記述できます。ポイントカットは、既存のソフトウェアにアスペクトを追加できるだけでなく、関心の分離が明確なソフトウェア設計も可能にします。つまり、プログラマはさまざまなアスペクトを統合(マージ)して、完全なアプリケーションを構築できるのです。
データベース内のレコードを変更できるアプリケーションがあるとします。ユーザーがデータベースを変更するたびに、誰がレコードを変更しているかに関する情報のログを取得したいとします。従来のログ記録方法は、データベースを変更する直前にログメソッドを呼び出すことです。アスペクト指向プログラミングでは、Modify Database メソッドにポイントカットを適用し、必要な情報をログに記録するために呼び出されるアドバイスを持つことができます。[ 3 ]
以下は、 AspectJでサポートされている重要なポイントカット式です。これらの式は論理演算子を使用して組み合わせることができます。[ 4 ]
実行(void User.setPassword ( password ) )このポイントカットは、User.setPassword メソッドの実行と一致します。
call ( void User . getPassword ())User.getPasswordが呼び出されると、このポイントカットが一致します。
ハンドラー( ArrayIndexOutOfBounds )ArrayIndexOutOfBounds例外が発生した場合、ポイントカットは一致します。
この(ユーザータイプ)現在実行中のオブジェクトがUserTypeである場合、ポイントカットは一致します。
ターゲット(ユーザータイプ)対象オブジェクトがUserTypeの場合、ポイントカットは一致します。
(ユーザータイプ内)ポイントカットは、実行されるコードがUserTypeに属している場合に一致します。
ポイントカット言語は、進化可能性や理解可能性といった重要なソフトウェア特性に悪影響を及ぼします。正しいアスペクトを定義するためにリファクタリングを実行する必要が生じる可能性がありますが、リファクタリングはコードをよりクリーンにするためのものなので、通常はこのようなことは起こらないはずです。また、同じコードに複数のアスペクトを適用し、各アスペクトごとに異なるリファクタリングが必要な場合、スケーラブルではありません。 [ 5 ]一般的に、ポイントカットにはメソッドのシグネチャが明示的に含まれているため、各アスペクトはアプリケーションの構造と密接に結合します。そのため、アプリケーションが変更されると、ポイントカットも変更する必要があります。これは開発者にとって非常に問題となる可能性があります。[ 5 ]