Head First Design Patternsの本を読んで、他の多くのデザインパターンを使用した後、Observerパターンを理解しようとしています。これは.NET Frameworkのイベントを使用して実装されていませんか?C#では、イベントを使用して既に実装されているオブザーバパターンではありませんか?
答えて
はい、そうです。オブザーバーパターンはパブリッシュ/サブスクライブパターンとも呼ばれ、まさにイベントによって可能になります。
そうです、イベントはオブザーバーパターンの実装です。しかし、私はまだ自分自身を書いている人たちの議論を読んだり、柔軟性を与えたり、イベントの起きる文法を避けるために議論を読んだりしています。
はい、同じです。
注:実際にイベントを理解したい場合は、オブザーバーパターンを学習し、しばらくそれを実装することをおすすめします。あなたがそれを完全に理解したら、自分でやることをやめ、本当に必要な場合を除いて、専門的かつ文書化された実装を使用してください。
私は、デルファイの経験に基づいて、オブザーバーパターンをC#のイベントでファーストクラスの言語機能にするのはAnders Heljsbergの意図だったと言います。 Anders氏は、このような設計意図を、Software Engineering Radioの優れたインタビューで明確にしています。
ほとんどの現代の言語は、いくつかのデザインパターンをネイティブサポートしています。明示的に実装する必要がなくてもネイティブでサポートされるパターンが多いほど言語は優れていると主張されており、この点でLispは優れています。ジェフはそれについてもsomething to sayでした。
はい、ただし、オブザーバーパターンを明示的にプログラミングして、代理人やイベントを使用しないと、コードを簡単にデバッグできます。
は違いを考えてみましょう:
public void NotifyObservers()
{
foreach(Product product in ProductList)
{
if (product is IProductObserver)
{
product.Update(this)
}
}
}
ここでは、変更の通知を受ける、リスト内のどのような製品は非常に明確です。デバッグ中にProductListを検査することができます。
デリゲートとイベントを使用すると、イベントを処理するために実際に「デリゲート」がいくつあったかを知ることは面倒です。
開発者に再利用の代わりに再実装を促す考え。 –
これについて詳しく説明できますか?つまり、どちらの場合でも開発者はパターンを実装する必要があります。私は基本的に明示的な例としてこれを書いています。なぜなら、あなたが実際に観察者のパターンを理解したいのであれば、最初にそれを構築し、後にイベントに行くことが最善であると私はDinahに同意しているからです。 – Hace
いいえ、同じ目的を達成しますが、違いはあります。 Observerパターンは、関数型プログラミングで簡単に達成できたことを達成するための設計のかなりのハックであり、.NETイベントは同じ目的を達成するために関数型プログラミングを使用すると言います。
Microsoftイベントと代理人を使用すると、オブザーバーパターンを適用する方法がc#であることを示しています。 イベントとデリゲートにいくつかの基本的な命名規則を使用して、独自のパターンを「イベントパターン」と命名しました。これは古典的なものよりもいくつか特別な利点を提供します。オブザーバーパターン
「イベントパターンは、」は記事「オブザーバーデザインパターンを探る」の内側にMSDNライブラリに記載されています。イベントや代表者に基づいて
、FCLはかなり広範囲にObserverパターンを使用しています。 FCLの設計者は、このパターンの本質的な力を完全に理解し、フレームワーク全体でユーザーインターフェイスと非UI固有の機能の両方に適用しました。しかし、この使用は、フレームワークチームがEvent Patternと呼んでいるBase Observerパターンのわずかなバリエーションです。一般に、このパターンは、イベント通知プロセスに関わるデリゲート、イベント、および関連するメソッドの正式な命名規則として表現されます。マイクロソフトは、Observerパターンのこの調査に基づき、CLRまたは標準のコンパイラ
には強制はありませんが、イベントとデリゲートを使用するすべてのアプリケーションやフレームワークは、このパターンを採用することをお勧めします、このパターンが提供することは明らかですそれらの機能(UIなど)に関係なく、アプリケーション内のオブジェクト間の鮮明な境界を保証する理想的なメカニズムです。コールバック(IObserverインターフェイスとIObservableインターフェイスを使用)を使用して実装するのはかなり単純ですが、CLRの代表者とイベントの概念は、大部分の「重量挙げ」を処理し、被験者と観察者の間の結合レベルを低下させます。この質問へのわずかに異なる答えを
- 1. 実装でスタックを使用しても問題はありませんか?
- 2. 純粋にライブラリとして実装されているC++のis_lambda特性はありませんか?
- 3. Asana Webhooks:Asana APIに実装されたタスク削除イベントはありませんか?
- 4. restサービスは、Eclipseでは実装されていてもTomcatでは実装されていません
- 5. IServerEvents.NotifyChannelを使用しているイベントがありません
- 6. Spring WebFlowは実装されたバリデータを使用していません
- 7. Rustにオブザーバパターンを実装するにはどうしたらいいですか?
- 8. DynamicIncastをQueryInterface実装で使用する必要はありませんか?
- 9. PopupWrapperで使用されているコンポーネントは、keyDownイベントを送出しません。
- 10. Javaを使用してInternet Explorerで実行されているWebDriverの例外はありません。
- 11. JavascriptでNodeJS /に実装されているルールエンジンはありますか?
- 12. Tango/Unity:Tango3DRExtractWholeMesh()は実際にはまだ実装されていませんか?
- 13. このデータセットではGETテーブルメソッドはサポートされていません - 実装されていません
- 14. Scheme/Lisp実装でガベージコレクタを使用していません
- 15. C#は継承された抽象メンバを実装していません
- 16. 抽象クラスはC#で実装されていますか?
- 17. rspecファクトリの実装時に、 'model_name'が既に定義されていて、 `rails console`を実行できません。
- 18. メソッドまたは操作は実装されていません。 C#の
- 19. イテレータに実装されている機能がありません
- 20. ValidatableBindableBaseはPrism.Wpfに実装されていませんか?どうして?
- 21. REST APIを使用してオブザーバパターンを実装することは可能ですか?
- 22. TIOGCPKTは実装されていませんか?
- 23. GoogleデモショップのようにGoogleタグマネージャが常に実装されているわけではありません。
- 24. GetHashCodeとEqualsはSystem.Attributeで正しく実装されていませんか?
- 25. コンテナとして使用できるIQueryableの実装はありますか?
- 26. プロジェクトの実装中に私はこのプロジェクトにC + +ファイルが含まれていますが、サポートされているネイティブビルドシステムを使用していません。
- 27. jquery document.ready()クライアントの実装はクロージャではありませんか?
- 28. C#gridviewはストアドプロシージャを実装していませんSQL
- 29. タイマーは初めて実装されていません
- 30. C++を使用してfastcgiを実装していますか?
、参照http://stackoverflow.com/questions/1023329/observer-pattern-implemented-in-c-sharp-with-delegates私は好きではない – kmote