Help us understand the problem. What is going on with this article?

小さいアプリを書いてデザインパターンを覚えたい(Stateパターン編)

More than 3 years have passed since last update.

はじめに

本稿は、デザインパターンっていくら記事や本を読んでもいまいち理解できない、という方(僕)のための記事です。
デザインパターンを適用した小さなアプリを作って、何が嬉しいのかを実際に見ていくことで、デザインパターンのありがたさと使いどころを感じてもらえれば嬉しいです。

環境

Unityを使用しています。
開発したソースはGitにあげています。

https://github.com/mutsuyuki/DesignPattern
(当記事投稿時点では、今回取り上げるのStateパターンのみです。)

また、作成済みのデモはこちらからご覧いただけます。
http://mtool.dip.jp/design_pattern/State_StopWatch/
 ※表示まで10秒くらいかかります。

[起動後画面イメージ]
スクリーンショット 2016-09-03 22.46.39.png

Stateパターン

アプリケーションを書いていると状態によってするべき処理が異なることがよくあります。
・ゲームなら、自分のターン・敵のターン、エフェクト表示中・入力待ち、などなど、
 状況に応じてUIのグラフィックや挙動を変える必要がある。
・事務処理なら、ビジター、会員、プレミアム会員で画面の挙動を変える必要がある。

考えればきりがありませんね。

最近アプリケーションを書いていて、こういった状態管理をif文で分けまくっていました。
するとどうでしょう、納品直前、微調整の要望があるたび(なぜかあるんです・・)
・ソース読みづらい
・ソース直す箇所多い
・ようやく直すと別のところがバグる
・チームのメンバーにも迷惑をかける
といった悲しい事態に襲われました。

頭のいい人はどんな設計をしているのだろう、と思ってあちこちを探しまくっていたところStateパターンというのを知りました。

状態をオブジェクトにする、という考え方は目からウロコでした。
この記事がわかりやすかったです。
http://www.techscore.com/tech/DesignPattern/State.html/

また、その便利さを実際のアプリケーションレベルで提供してくれているこの記事は神です。
http://qiita.com/ms2sato/items/416dd5c2db88997deb0c

今回書いた小さいアプリはストップウォッチなのですが、実のところ、上記記事でcoffeeスクリプトで書かれたものをUnityに置き換えただけです。
そんなわけで、上記記事の作者のms2satoさんには大大大感謝致します。

元記事の方にもありますが、このストップウォッチにはif文が一つも使われていません。
そのかわりに、状態を表すStateクラスを作成し、稼働中(Running)、一時停止(Pause)、停止(Stop)のそれぞれの状態ですべきことだけをStateクラスを継承したクラスの中で記述する、という部分が肝です。

細かい部分はソースコードを読んでもらえればということで省略いたしますが、要望があればコードを掲載して解説を追記します。

さいごに

実際に書いてみて思ったのですが、サンプルアプリはビューとその他のロジックの結合度が高すぎる(ビューにモデル、コントローラーを直接渡したりする)ので、そこら辺を疎結合にして、次回はMVCで記事を書いてみようかと思っています。

MVCはデザインパターンじゃないじゃないか、というご意見もあるかもしれませんが、GoFのにこだわっているわけではなく、設計の手法として有用そうなものがあればそれを小さくまとめてリファレンスにしたい、という感じです。

ツッコミなどあれば大歓迎です。

また、もし得意なデザインパターンとか感心したデザインパターンがあれば、サンプル作りに参加して頂けたりしたら泣いて喜びます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away