14

私はオンライン ドキュメントをざっと読んだり、wiki エントリ、投稿、ブログを読んだりしましたが、まだ戸惑っています。

  • 一言で言えば、アスペクト指向プログラミングとは何ですか?
  • オブジェクト指向プログラミングよりも優れているのでしょうか? OOP を学習解除する必要がありますか?
  • そうでない場合、いつどちらを使用するかをどのように知ることができますか? 2つの主な違いは何ですか?
  • 一方を他方にリファクタリングできますか?

私は常にOOの男であり、反逆罪を犯す必要があるかどうかを知りたい.

真剣に、私はすぐに新しいプロジェクトを開始し、最初に正しい選択をしたいと思っています.

4

5 に答える 5

18

一言で言えば、アスペクト指向プログラミングとは何ですか?

簡単に言うと、AOP は、別のプログラムの典型的なフローに目立たないようにアクションを挿入する機能です。クラスのインスタンス化、メソッド呼び出し、割り当てなどをキャプチャできます。

オブジェクト指向プログラミングよりも優れているのでしょうか? OOP を学習解除する必要がありますか?

いいえ、いいえ。それをサポートする任意のプログラミング環境と連携して動作します。(上記を参照)。

そうでない場合、いつどちらを使用するかをどのように知ることができますか? 2つの主な違いは何ですか?

通常、クラス自体を操作せずに、何百ものクラスに何らかのアクションを実装する場合は、AOP を使用します。典型的な例は、セキュリティ (特定のメソッド/クラスを呼び出す権利の承認) またはロギングです。ただし、私の経験では、これには使用しません。(正直なところ、私はそれをまったく使用しません)。

上記のように、比較できないため、主な違いは実際には存在しません。ただし、ロギングを「通常どおり」実装したい場合は、適切な時点でロガーを呼び出すだけです。

log.write("hello");

しかし、AOP を使用すると、各メソッド呼び出しにアタッチする「アスペクト」を作成し、「呼び出されたメソッド b」をログに記録できます。ポイントは、AOP ではアプローチがより「散弾銃」であるということです。つまり、すべてにアタッチするか、小さなサブセットにアタッチします。一般に、ログを手動で追加する方が適切です。

一方を他方にリファクタリングできますか?

実際には関係ありません。他の回答を参照してください。ここでもセキュリティを考慮して、典型的な OOP モデル this.IsAllowed() から if(callingMethod.HasAttribute(foo)){ allowed = true; などの AOP モデルに切り替えることができます。}

それらの答えが役立つことを願っています。さらに拡大したい場合はお知らせください。

于 2009-08-25T00:04:48.603 に答える
5

いいえ、AOPはOOPに取って代わるのではなく、OOPを補完します。AOPとOOPは、動作を組み合わせるのに役立つさまざまな種類の「接着剤」を提供します。もちろん、OOPを使用すると、継承や構成などを通じて動作を組み合わせることができます。一方、AOPを使用すると、選択したクラスの選択したメソッドの前後に新しいコードが実行されるポイントカットをインターセプトすることで、横断的関心事に対処する動作を追加できます。

横断的関心事の一般的な例としては、セキュリティ、ロギング、トランザクション制御などがあります。優れた設計の基本原則は一貫性です。理想的には、コードの一部が1つのことだけを実行する必要があります。そのため、たとえば、データアクセスクラスにセキュリティコードを追加するために水を濁しています。AOPは、「アスペクト」に動作を追加し、セキュリティ制御が必要なすべてのクラスにそのアスペクトを適用できるようにすることで、この特定の問題を解決します。

于 2009-08-25T00:13:03.517 に答える
2

AOP は OOP とは異なり、開発に対するアプローチがまったく異なります。

基本的に、ロギング、認証に関する問題、パフォーマンス チェック コードがある場合、これらはプログラムのさまざまな部分、異なるクラスでほぼ同じになります。そのため、思い描いたとおりにアプリケーションを Java で作成できます。次に、これらの他のタイプのコード (クロスカッティングの問題) を追加する必要がある場合は、それらをプログラムに挿入して、コンパイルできるようにします。ソースコードを見ると、そこに必要なビジネス ロジックが表示されます。

AOP または OOP をいつ使用するかについては、プログラムを作成して動作させることをお勧めします。次に、プログラムが機能するようになったら、実際には関数と関係なく、他の目的に役立つコードを削除することを検討してください。たとえば、入力パラメータを使用する前にそれらが正しいことを確認する必要がある場合は、そのためにアスペクトを使用します。データアクセスレイヤーでスローされたすべての例外がログファイルに書き込まれるなど、同様のイベント処理がある場合は、そのためのアスペクトを作成します。

これらの横断的な懸念を取り除くと、コードは小さくなります。

より多くの経験を積むにつれて、AOP のより多くの用途が見られるようになりますが、最初は AOP を作成し、次に AOP を使用してリファクタリングすることをお勧めします。

Java を使用している場合は、AOP に Eclipse を使用します。AJDT プラグインは、アスペクトを追加する場所を確認するのに非常に役立ちます。

于 2009-08-25T00:09:18.170 に答える
2

アスペクト指向プログラミングは、呼び出しや戻りなどの重要なポイントでアクション (「アドバイス」と呼ばれる) をメソッドまたは関数に挿入するためのキャッチーな流行語です。AOP は、言語に組み込まれているすべての抽象化の障壁に違反しているため、AOP には大きな問題があります。モジュールが「これはアスペクトが干渉できるものであり、これはアスペクトが干渉できないものである」と言う方法はありません。その結果、内部不変条件に違反するリスクが生じ、モジュラー推論の原則が破壊されます (モジュールがインポートする他のモジュールのインターフェース以外は何も理解する必要なく、モジュールを理解できます)。

数年前、Raymie Stata は、オブジェクト指向言語がサブクラス化を制御し、重要な不変条件に違反するのを防ぐ方法について、素晴らしい博士論文を書きました。AOP に対応する作業はまだ作成されていません。

通用する他のアイデアと同様に、AOP はいくつかの素晴らしい成功を収めていますが (たとえば、ロギングを考慮して設計されていないアプリケーションにロギングを後付けするなど)、AOP の使用を非常に単純なケースに限定することをお勧めします. あるいは、アスペクト指向プログラミングにノーと言うほうがよいでしょう。

于 2009-08-25T01:08:52.323 に答える
0

推奨読書:Eclipse AspectJ:AspectJとEclipseAspectJ開発ツールを使用したアスペクト指向プログラミング

于 2009-08-25T00:19:14.257 に答える