« IPAが公開したRubyやRails教育プログラム | トップページ | Redmineの次のリリース日は? »

2010/06/19

ObserverパターンとMulticastパターン

JavaよりもC#が優れている点は、Deledateという機能があるおかげでイベント通知のロジックが書きやすい点にある。
Javaでは、Multicastというデザイパターンでカバーする必要がある。
平鍋さんの記事が分かりやすいのでメモ。

【元ネタ】
- デザインパターンによる進化的設計

Jude開発記

- Java プログラマのためのデザインパターン入門

[Effective C#] 項目21 デリゲートを使用してコールバックを実現する | まさくらのブログ

デザインパターンにあるObserverパターンは、デスクトップアプリを作る時に非常に重要なパターン。
GUI上のイベントをキャッチして、次のイベントを発火するロジックに使うから。

しかし、- デザインパターンによる進化的設計に書いてあるように、Push型のObserverパターンでもPull型のObserverパターンであっても、情報取得のロジックでキャストが発生する弱点がある。
つまり、画面の情報を取得して次のイベントを発火するする際に、イベントのオブジェクトタイプを判定(instanceof)して分岐する必要があるのだ。

updateメソッドでキャストが発生するということは、コンパイルエラーのチェックが効かないこと、つまり、タイプセーフ(型安全)でないことを意味する。
すなわち、オブジェクト指向に沿っていないのだ。

その解決方法として、Multicastパターンがある。
MultiCastパターンは,GoFの23パターンに含まれていないが、パターンハッチング―実践デザインパターン (Software patterns series)という本では、GoFの間でデザインパターンに入れるべきかどうか激論があったという節がある。

このパターンは、JavaではSwingのリスナー、C#ならDeledateが相当するだろう。
つまり、複数のイベントが発生して制御する場合は、各イベントに対応する各リスナー(Delegate)を用意して、リスナーをキューに溜め込んで、イベント変更の通知タイミングでリスナーを発火させる。

例えば、Javaのリスナーには、addListener(), removeListener()のようなメソッドを用意すればいい。
C#の場合は、Delegateに「+=」「-=」というメソッドがあるので、より直感的。

個人的には、Javaの方が仕組みがシンプルな分、手続きが多いけれど、仕組みが丸見えなので好きだ。
実際のコーディング量はC#の方が減るだろう。

Webプログラミングは何故オブジェクト指向でない?~WicketはWebプログラミングにオブジェクト指向を取り戻すに書いたけれど、JavaによるWebプログラミングには上記のようなイベント処理を書く状況が全くないと言っていい。
とはいえ、JavaScriptがクライアントアプリで重要になってきた現在、デスクトップアプリのベストプラクティスであるデザインパターンは、もう一度見直してもいいと思う。

|

« IPAが公開したRubyやRails教育プログラム | トップページ | Redmineの次のリリース日は? »

プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: ObserverパターンとMulticastパターン:

« IPAが公開したRubyやRails教育プログラム | トップページ | Redmineの次のリリース日は? »