ObserverパターンとMulticastパターン
JavaよりもC#が優れている点は、Deledateという機能があるおかげでイベント通知のロジックが書きやすい点にある。
Javaでは、Multicastというデザイパターンでカバーする必要がある。
平鍋さんの記事が分かりやすいのでメモ。
【元ネタ】
- デザインパターンによる進化的設計
[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がクライアントアプリで重要になってきた現在、デスクトップアプリのベストプラクティスであるデザインパターンは、もう一度見直してもいいと思う。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント