ゲームの後半に来ますが、この質問に出くわすかもしれない後の開発者にこれを提供します。
アプリケーションが正しく動作するためにアプリケーションに依存している場合、AOPに強くお勧めします。アスペクトは次のように機能します。
- アドバイス(追加の動作)が適用されます
- 結合ポイント(メソッドの開始や終了など、追加のコードを付加できる場所、または特定のイベントがトリガーされるとき)
- ... ポイントカット(特定の結合ポイントが一致するかどうかを検出するパターン)パターンが一致する場所
長い間コンピューターを使用している人にとって、パターンが使用されているという事実は、注意深く見るべきものかもしれません。ここset
で、引数に関係なく指定されたメソッドに一致するポイントカットの例を示します。
call(* set(..))
したがって、これはかなり抜本的なポイントカットであり、多くのことにアドバイスを適用しているので、これを慎重に扱うことが推奨されることは明らかです(しゃれは意図していません)。
または、名前や署名に関係なく、すべてにアドバイスを適用しましょう!
execution(* *(..))
したがって、明らかにここには多くの力があるので注意する必要がありますが、これはアスペクトに対する議論ではありません。 aopのバグをお楽しみください)。
比較的安全なポイントカットのように見えるものは次のとおりです。
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
名前付きsetX
またはオブジェクトsetY
上のメソッドPoint
が見つかった場合、明示的にアドバイスを提供します。メソッドはを受け取ることができるだけであり、を受け取るint
必要がありますvoid
。かなり安全そうですね。これらのメソッドが存在し、正しいアドバイスを適用した場合、それは安全です。そうでない場合、あまりにも悪い。静かに失敗します。
例を挙げると、友人がJavaアプリケーションをデバッグしようとしていたときに、誰もが不正確なデータを返すことがありました。これはまれな障害であり、特定のイベントや特定のデータと相関しているようには見えませんでした。これはスレッド化バグであり、テストや検出が難しいことで有名です。結局のところ、メソッドをロックして「スレッドセーフ」にするためにアスペクトを使用していましたが、プログラマがメソッドの名前を変更し、ポイントカットが一致しなかったため、アプリケーションのサイレントブレークが発生しました。
したがって、AOPを使用して例外のような側面を処理する必要がある場合、適切に設計されたシステムで何も問題がなければ、それらを削除してもソフトウェアは正しく機能することを人々に伝えます。ただし、プログラムの機能がAOPに依存する場合、プログラムに脆弱性が導入されますが、これは保証されません。
したがって、ロギング、デバッグ、およびトレースは、側面に最適な動作の優れた例ですが、セキュリティはどうですか?いや。スレッドセーフ?いや。
AOPの堅牢な代替手段については、traitsを参照してください。言語にボルトで固定されるのではなく、直接言語に統合され、「特性認識」IDEを必要とせず(助けにはなりますが)、必要なメソッドが存在しない場合はコンパイル時に失敗します。特性は、問題が最初から明確に定義されていたため、関心の分離を処理する非常にクリーンな仕事をします。私はそれらを広範囲に使用し、それらは素晴らしいです。