読者です 読者をやめる 読者になる 読者になる

ITお絵かき修行

3歩歩いても忘れないために

『オブジェクトデザイン』第2章 DoubleDispatchパターン実装

下記エントリに影響を受けて、『オブジェクトデザイン』を読み始めている。kymmt90.hatenablog.com

『オブジェクトデザイン』の第2章において、DoubleDispatchパターンの実装が紹介されているが、
要点が書かれているだけで全体の実装が書かれていなかったので、実装してみた。
DoubleDispatchパターン自体は、GoFのVisitorパターンとほとんど同じものらしい。

【要件】
じゃんけん(Scissors,Paper,Stone)*1を実装する。
オブジェクト自身にオブジェクトが他のオブジェクトを負かすかどうかを判定する処理を書いておく。
→3種類のオブジェクトにじゃんけんの処理を記述するため、9通りの結果が生じることになる。

【書籍からの変更点】
『オブジェクトデザイン』の例では、「あいこ」の場合が考慮されていなかったので、
「あいこ」を表現するために、booleanからintで数値を返却するよう変更した。
変更に伴い、他のオブジェクトを負かすかどうかの判定処理を抽象クラス(※新規作成)に追い出して共通化した。

【シーケンス図】※だいぶ適当
f:id:hhhhhskw:20151101151824j:plain

【実装】github.com
■実行結果の例 (※標準出力)

自分の手 : パー
相手の手 : グー
勝敗 : 勝ち


【感想】
「操作するデータの型」「データごとの操作」に対する判定処理が消えたことで、各クラスの関心事を細かく分断することができた。
ただしインタフェースクラスに定義するメソッドの数、シグネチャが変動する可能性があるので、初期設計が難しそう。


【参考】
ダブル・ディスパッチ~ 典型的なオブジェクト指向プログラミング・イディオム ~

オブジェクトデザイン (Object Oriented SELECTION)

オブジェクトデザイン (Object Oriented SELECTION)

*1:グーはRockではなくてStoneで習った気がしたので…