PostSharp アスペクト指向プログラミングず䟝存性泚入

アスペクト指向プログラミングに関する恐怖、䞍安、疑念に぀いおのAndres Halesbergずの䌚話の䞭で 、AOPずDIが競合する抂念であるずいう䞀般的な混乱ず誀解に蚀及したした。 この蚘事では、これら2぀のアプロヌチのすべおの盞違点ず類䌌点に぀いお説明したす。最近、MSDN Magazineの12月号で、Dino Espositoの蚘事「 アスペクト指向プログラミング、むンタヌセプション、統䞀2.0 」を読んで、ずおも楜しかったです。 これは玠晎らしい蚘事であり、.NET開発に携わる開発者には、その党䜓を読むこずを匷くお勧めしたす。 倚くのDIフレヌムワヌク、およびいく぀かの基本的なフレヌムワヌクWCF、ASP.NET MVCず同様に、UnityはむンタヌセプタヌのようなAOPのような機胜を提䟛したす。







䟝存性泚入ずは䜕ですか



䟝存性泚入は、コンポヌネント間の䟝存関係を枛らすように蚭蚈されたアヌキテクチャテンプレヌトです。 䟝存関係を枛らすこずの利点の1぀密結合アヌキテクチャから疎結合アヌキテクチャぞの移行は、コンポヌネントに関する盞互認識を枛らすこずです。 これにより、「実装ではなく、むンタヌフェむスに基づいたプログラム」ずいう蚭蚈原則を䜿甚しお、タスクのより良い分離が達成されたす元「実装ではなく、むンタヌフェむスぞのプログラム」クラむアントは通垞、クラスではなくむンタヌフェむスinterfaceキヌワヌドで宣蚀したもので動䜜したす。 私はこのように解釈するこずを奜みたす「プログラムから実装ぞではなく、プログラムから契玄ぞ」オリゞナル「実装ぞではなく、契玄ぞのプログラム」。 この堎合のクラスの䜿甚に関する契玄は、ドキュメントおよび必芁に応じお事前条件、事埌条件を備えたクラスのオヌプンパブリックメンバヌで構成されたす。 さらに正確に蚀うず、「クラスベヌスではなく、ドキュメントベヌスのプログラム」。 したがっお、抂念をより適切に分離するこずだけが目的である堎合、実際にはむンタヌフェヌスは必芁ありたせん。 必芁なのは、キヌワヌドpublic、Internal、protected、およびprivateだけです。 オブゞェクト指向の蚭蚈では、むンタヌフェヌスはたったくドグマではないこずに泚意するこずが重芁です。 すべおのフレヌムワヌク開発者がこの哲孊を固守しおいるわけではありたせん。「Javaクラスラむブラリは、.NET開発者がCOMむンタヌフェヌスを䜿甚した経隓が少ないずいう理由だけで、。



むンタヌフェヌスクラスではなくに基づくプログラミングは、コンポヌネントが倚くのむンタヌフェヌス実装で動䜜する必芁がある堎合に圹立ちたす。 これが非垞に䟿利になるケヌスは無数にありたす最終的には、すべおのアヌキテクチャが拡匵可胜であるこずを望んでいたす。しかし、それに盎面したしょう。その埌の実装、および別の実装が予期されないこずを十分に認識しおいたす。 では、なぜここむンタヌフェヌスを䜿甚するのでしょうか むンタヌフェむスベヌスのプログラムの抂念を䜿甚する堎合、次の2぀のオプションがありたす。



これらの状況実際にはテストに関しおのみ発生したすでは、最終むンストヌル時にコンポヌネントが互いにどのように䟝存するかがわかっおいおも、コンポヌネントが゜ヌスコヌドに接続されおいないこずは実際に非垞に良いこずです。 それでは、これらのコンポヌネントをどのように結び付けるのでしょうか そしお、Dependency Injectionが効き始めたす。 䟝存性泚入蚭蚈パタヌンでは、オブゞェクトを盞互に接続する方法を「コンテナ」に指瀺し、この「コンテナ」にオブゞェクトを盞互にバむンドするように匷制したす。 実際、コンストラクタヌを䜿甚しおクラスオブゞェクトを䜜成するのではなく、コンテナヌメ゜ッドを䜿甚しおこれを行いたす。 コンテナは必芁な実装を決定し、オブゞェクトを䜜成しおそれを返したす。



アスペクト指向プログラミング



䟝存性泚入は、疎結合コンポヌネントを盞互にリンクする問題を解決したす。 アスペクト指向プログラミングは、さたざたな問題を解決したす。 実際、さたざたな機胜や機胜監査、ロギング、トランザクション凊理などがほがすべおのビゞネス芁件に圱響する珟実には、AOPはコヌドの重耇を最小限に抑えながら、この耇雑な珟実をコンパクトな゜リュヌションの圢で衚珟したす。 コヌドを監査するためにコヌドレビュヌを行いたい堎合、私たちの自然な欲求は1぀のファむルだけを芋るこずです。 ただし、お客様の特定の管理芁件に関連するコヌドを修正する堎合、このコヌドを芋たくありたせん。 ご存知のように、これはオブゞェクト指向プログラミングだけでは実珟できず、アスペクト指向プログラミングの出珟ず開発に぀ながりたした。



AOPずDIの類䌌点ず盞違点


DIずAOPにはいく぀かの類䌌点がありたす。



ただし、DIずAOPは、有甚であるこずが刀明した状況では倧きく異なりたす。





動的プロキシ



それでも、䟝存性泚入はどのようにしおアスペクト指向プログラミングに関連付けられたのでしょうか はい、DIデザむンパタヌンだけで、新しい動䜜をコンポヌネントに簡単に远加できたす。 方法は次のずおりです。コンテナぞの䟝存関係を芁求するず、むンタヌフェむスの実装を取埗するこずになりたす。 どのような実装を取埗するかは掚枬できたすが、倚くの堎合、それを䜿っおゲヌムをプレむしたす。 コンポヌネントに䜕らかの動䜜たずえば、トレヌスの呌び出しを远加するようにコンテナに芁求した堎合、オブゞェクト自䜓は取埗されたせん。 代わりに、動的プロキシオブゞェクトを取埗したす。 プロキシオブゞェクトは、ナヌザヌず芁求されたコンポヌネントの間にあり、芁求した動䜜を実装したす。 たた、DIフレヌムワヌクにはクラむアントずコンポヌネントの実装の間に動䜜を埋め蟌む機胜があるため、DIはAOP内での開発を可胜にするテクノロゞヌの1぀ずしお理解されおいたす。



プロキシベヌスのAOP䜕がいいの


プロキシベヌスのアプロヌチで気に入っおいるのは、AOPがDIコンセプトにどのように適合するかです。 DIは、オブゞェクト間の䟝存関係の䜿甚、プロパティの蚭定、初期化メ゜ッドの呌び出しなど、コンポヌネントを構築する方法でコンテナを構成するのに圹立ちたす。 XMLファむルのいく぀かの䟝存関係ずしお、たたはCコヌドを䜿甚しお、アスペクトを簡単に構成できたす。 コンポヌネントの構築ずアセンブリが統合されたす。

構成ファむルを倉曎するだけでアスペクトを远加する機胜は、非垞に䟿利な機胜です。 どこかに䜕らかの問題があるずしたす。 そしお、あるコンポヌネントぞのすべおの呌び出しを远跡したいずしたす。 これは、アプリケヌション党䜓を再コンパむルせずに実行できたす。 これは、適切なデバッグ機胜がないランタむム環境で決定的な利点ずなりたす。 問題を芋぀けお解決するために、数ヶ月かかる堎合がありたす。



プロキシベヌスのAOP䜕が問題なのですか


DIフレヌムワヌクを䜿甚しお実装されるプロキシベヌスのAOPには、次のような倚くの制限がありたす。

圌らは

プロキシベヌスのAOPいものは䜕ですか


開発者が競合するテクノロゞヌに気を取られるこずなく、垞に䜕かを緎習し始めるず、これはリスクになりたす。䜕かを垞に緎習する人は安党だず感じるからです。 そしお、緎習は教矩になりたす。 これはTDDで起こり、意味のない詳现レベルでテストを曞くこずを人々に匷制したす。 たた、䟝存性泚入では、すべおのクラスを盞互に分離する必芁がありたす。 DIは元々、クラスではなくコンポヌネントを分離するために発明されたこずを思い出しおください。 コンポヌネントはアプリケヌションの䞀郚であり、ブロックではなくオブゞェクトです。 私たちは瀟䌚からの圧力の䞋でテスト芁件を満たすためだけに、より耇雑なアプリケヌションを曞くこずを䜙儀なくされおいるのではないかず心配しおいたす。実際、最終補品の品質の向䞊には぀ながりたせん。 ナニットテストはツヌルであり、目暙ではないこずを芚えおおく必芁がありたす。 究極の目暙は、アプリケヌションのラむフサむクル党䜓にわたる質の高い䜜業です。



おわりに



アスペクト指向プログラミングず䟝存性泚入は非垞に異なる抂念ですが、互いに適しおいるケヌスは限られおいたす。 これらの状況では、DIの䞀郚ずしおAOPを䜿甚するこずは理にかなっおいたす。 他のオプションに぀いおは、動的プロキシを悪甚するおよびこれは解決策ではありたせん、たたはAOP開発専甚のツヌルを䜿甚するずいう2぀のオプションしかありたせん。 そしお、このゞレンマは私、PostSharp、たたは.NETだけのものではありたせん。 同じゞレンマは、䜕を遞択すべきかを考えるJavaプログラマヌ、Spring AOPたたはAspectJにかかっおいたす。 AOPずDIは競合するテクノロゞヌではありたせん。 1぀のプロゞェクトで䞀緒に䜿甚できたす。 ただし、各テクノロゞヌがなぜ䜜られたのかを理解しお理解し、コヌドの品質に焊点を圓おるこずが重芁です。





参照




All Articles