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. 純粋にライブラリとして実装されているC++のis_lambda特性はありませんか?
- 2. PopupWrapperで使用されているコンポーネントは、keyDownイベントを送出しません。
- 3. Javaを使用してInternet Explorerで実行されているWebDriverの例外はありません。
- 4. DynamicIncastをQueryInterface実装で使用する必要はありませんか?
- 5. Scheme/Lisp実装でガベージコレクタを使用していません
- 6. Tango/Unity:Tango3DRExtractWholeMesh()は実際にはまだ実装されていませんか?
- 7. JavascriptでNodeJS /に実装されているルールエンジンはありますか?
- 8. イテレータに実装されている機能がありません
- 9. タイマーは初めて実装されていません
- 10. GetHashCodeとEqualsはSystem.Attributeで正しく実装されていませんか?
- 11. ListBoxはReactiveUIのUWPに実装されていません
- 12. C#gridviewはストアドプロシージャを実装していませんSQL
- 13. 抽象クラスはC#で実装されていますか?
- 14. コンテナとして使用できるIQueryableの実装はありますか?
- 15. C++を使用してfastcgiを実装していますか?
- 16. ApacheMQを使用してJMSを実装できません
- 17. margin:0を使用していても、Firefoxはセンターテーブルではありません。
- 18. Node.js "コールバックは既に呼び出されています"。しかし、他のコールバックはありません
- 19. なぜC#ディクショナリはすべてIDictionaryを実装していませんか?
- 20. EntityFrameworkコンテキストが正しく実装されていませんか?
- 21. onbeforeunloadイベントはiPhoneでサポートされていませんか?
- 22. なぜJavaは低遅延に使用されますが、C#は実際にはありませんか?
- 23. C#:ObservableCollection - 汎用の "CollectionChanged"イベントはありませんか?
- 24. C#のHashtable型は、連鎖またはオープンアドレッシングを使用して実装されていますか?
- 25. パス '...'のコントローラが見つかりませんでした。またはIControllerを実装していません
- 26. パス '/BingSiteAuth.xml'のコントローラが見つかりませんでした。またはIControllerを実装していません
- 27. excel 2007を使用してexcelが既に実行されている状態でworkbook_Open()が実行されていません
- 28. IE8でのJavascriptエラー:実装されていません
- 29. java.io.IOException:HTTP/1.1 501ラリーでメソッドが実装されていません
- 30. "SQLite JDBCドライバで実装されていません"
、参照http://stackoverflow.com/questions/1023329/observer-pattern-implemented-in-c-sharp-with-delegates私は好きではない – kmote