一言で言えば、アスペクト指向プログラミングとは何ですか?
簡単に言うと、AOP は、別のプログラムの典型的なフローに目立たないようにアクションを挿入する機能です。クラスのインスタンス化、メソッド呼び出し、割り当てなどをキャプチャできます。
オブジェクト指向プログラミングよりも優れているのでしょうか? OOP を学習解除する必要がありますか?
いいえ、いいえ。それをサポートする任意のプログラミング環境と連携して動作します。(上記を参照)。
そうでない場合、いつどちらを使用するかをどのように知ることができますか? 2つの主な違いは何ですか?
通常、クラス自体を操作せずに、何百ものクラスに何らかのアクションを実装する場合は、AOP を使用します。典型的な例は、セキュリティ (特定のメソッド/クラスを呼び出す権利の承認) またはロギングです。ただし、私の経験では、これには使用しません。(正直なところ、私はそれをまったく使用しません)。
上記のように、比較できないため、主な違いは実際には存在しません。ただし、ロギングを「通常どおり」実装したい場合は、適切な時点でロガーを呼び出すだけです。
log.write("hello");
しかし、AOP を使用すると、各メソッド呼び出しにアタッチする「アスペクト」を作成し、「呼び出されたメソッド b」をログに記録できます。ポイントは、AOP ではアプローチがより「散弾銃」であるということです。つまり、すべてにアタッチするか、小さなサブセットにアタッチします。一般に、ログを手動で追加する方が適切です。
一方を他方にリファクタリングできますか?
実際には関係ありません。他の回答を参照してください。ここでもセキュリティを考慮して、典型的な OOP モデル this.IsAllowed() から if(callingMethod.HasAttribute(foo)){ allowed = true; などの AOP モデルに切り替えることができます。}
それらの答えが役立つことを願っています。さらに拡大したい場合はお知らせください。