はじめに
下記を見ていたらStateパターンがとても不憫になったので、「僕はそばにいるよ」とコードで示してあげたくなりました。
http://qiita.com/irxground/items/d1f9cc447bafa8db2388#3-20
http://qiita.com/magicant/items/64685c41fdb85d03c33b#3-4
せいか
書いたのはこんな感じでiPhoneのストップウォッチを真似したものです(jsdo.itが終了してたのでcodepenにしました)。
https://codepen.io/ms2sato/pen/JjGPdWy
コードはGitHubにあります。
https://github.com/ms2sato/gof/blob/master/state/main.js
おもっていること
上記のコード、ifやswitchのような条件分岐をひとつも使っていません。Stateパターンの最大の効果はこの「ifを減らせる」という事だと思っています。多くのパターンもその効能があることが多いだろうし、そもそも基本であるポリモーフィズムすらifを減らす為にやってると言っても過言ではないと個人的には思っています。統計取ったことは無いけれど、体験的にはバグの発生率と条件分岐の数は相関してるはず。
もしも同じようなswitchやifが何度も出てくるような場合にはこのパターンを検討する理由としては十分だと思います。もちろん検討の結果、他の設計手法になることもあるでしょうけれど。
GoFのデザインパターンが書かれた当時は今ほどWEBのアプリケーションを書いていることは多くなくて、サーバー&専用アプリで動くいわゆるクラサバでやったり、そもそもネットワークなど使わずにローカルにインストールするアプリもかなり多かった時代だと思うので(C++がサンプルだったのもそういう事情だと思います)、今見ると「これって何の意味あんの?」という事はひょっとしたら多いのかもしれません。
ただ、ブラウザのJavaScriptが状態を持つことによるクライアント側MVC(元祖MVC)は上記の時代と求める要件が似ている状況にもなるので、そっちで有効なパターンなどはあるのだろうと思います。どれがどうのとかよく考えてないけどw
そもそも設計とメリット・デメリットをまとめたカタログなので「あーこういうのあるんだね。へー。」で良いし、会話する時に「そこはxxパターンっぽく処理するといいんじゃない?」程度の語彙を提供する目的だったはずなので、載っているから凄い効果があるとか載ってないとダメとかは無いんですよね。
今に則した新しいデザインパターンとか誰か書いてくれたら見てみたいなぁ。どういうのが載ってくるんだろう。ワクワクするね。