SlideShare a Scribd company logo
1 of 25
Download to read offline
GoFのデザインパターン
 Stateパターン編
        2013/03/01(金)
                伊藤歩
本日のアジェンダ
・デザインパターンとは
・Stateパターンの具体例
・Stateパターンのメリット
・デザインパターンの注意点
デザインパターンとは

過去のソフトウェア設計者が発見し
編み出した設計ノウハウを蓄積し、
名前をつけ、再利用しやすいように
特定の規約に従ってカタログ化したもので
ある。
              wikipediaより
過去のソフトウェア設計者
過去のソフトウェア設計者




       Gang of Four
  (ギャング・オブ・フォー、四人組)
Stateパターンの具体例サンプル

PLAY、STOP、PAUSEという状態がある

各状態で特定のコマンドを実行した時、
違う挙動をするプログラムを作成する。
if文で分岐させると・・・
// コマンドqを受け取った場合
if (s.equals("q")) {
     if (mState == STATE_PLAY) {
         System.out.println("STATE_PLAY:q");
     } else if (mState == STATE_STOP) {
         System.out.println("STATE_STO::q");
     } else if (mState == STATE_PAUSE) {
         System.out.println("STATE_PAUSE:q");
     }
}
if文で分岐させると・・・
// コマンドwを受け取った場合
if (s.equals("w")) {
     if (mState == STATE_PLAY) {
         System.out.println("STATE_PLAY:w");
     } else if (mState == STATE_STOP) {
         System.out.println("STATE_STOP:w");
     } else if (mState == STATE_PAUSE) {
         System.out.println("STATE_PAUSE:w");
     }
}
if文で分岐させると・・・
// コマンドeを受け取った場合
if (s.equals("e")) {
     if (mState == STATE_PLAY) {
         System.out.println("STATE_PLAY:e");
     } else if (mState == STATE_STOP) {
         System.out.println("STATE_STOP:e");
     } else if (mState == STATE_PAUSE) {
         System.out.println("STATE_PAUSE:e");
     }
}
さぁ野郎ども、
仕様追加のお時間だ!
さぁ野郎ども、
仕様追加のお時間だ!

コマンド”r”も追加な。
※全部の状態で。
そしてこうなる
// コマンドrを受け取った場合
if (s.equals("r")) {
     if (mState == STATE_PLAY) {
         System.out.println("STATE_PLAY:r");
     } else if (mState == STATE_STOP) {
         System.out.println("STATE_STOP:r");
     } else if (mState == STATE_PAUSE) {
         System.out.println("STATE_PAUSE:r");
     }
}
喜べ野郎ども、
また仕様追加だ!!!
喜べ野郎ども、
また仕様追加だ!!!

状態RECを追加な!
※全部のコマンドで
喜べ野郎ども、
また仕様追加だ!!!

状態RECを追加な!
※全部のコマンドで
状態×コマンド分の分岐が発生・・・




    if文地獄の
   幕開けである。
そんなときにStateパターン

状態をクラスとして設計。
そんなときにStateパターン

状態をクラスとして設計。

オブジェクトの状態に応じて、
挙動を変える場合に有効。
Stateパターンのクラス図
状態に応じたInterfaceを用意

public interface State {
  void func_q();
  void func_w();
  void func_e();
  void func_r();
}
Interfaceを実装する状態クラス作成
public class PlayState implements State {
    public void func_q(){
          System.out.println("STATE_PLAY:q");
    }
    public void func_w() {
          System.out.println("STATE_PLAY:w");
    }
    public void func_e() {
          System.out.println("STATE_PLAY:e");
    }
    public void func_r() {
          System.out.println("STATE_PLAY:r");
    }
}                                      StopやPauseも同様に、
                              StateのInterfaceを実装します。
状態によって、
オブジェクトを切り替える

State state = null;
if (n == STATE_PLAY) {
    state = new PlayState();
} else if (n == STATE_STOP) {
    state = new StopState();
} else if (n == STATE_PAUSE) {
    state = new PauseState();
}
あとはメソッドを呼ぶだけ
// コマンドに応じて処理を実行
if (s.equals("q")) {
    state.func_q();
}
if (s.equals("w")) {
    state.func_w();
}
if (s.equals("e")) {
    state.func_e();
}
Stateパターンのメリット

・コマンドや状態の追加で既存に影響ない。

・処理の修正は各Stateクラスで閉じる。

・コードの見通しが良くなる。

    影響範囲が少ないので、
    デバッグ工数が削減可能。
      保守性の向上。
デザインパターンの注意点

無理に導入しない。

Stateパターン使う俺カッコイイ(・∀・)
みたいなノリで、使うのはNG。

あくまでオブジェクトの状態に応じて、
挙動を変える場合に有効。

More Related Content

What's hot

ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたTakahiro Miyaura
 
Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編NAKAOKU Takahiro
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?KLab Inc. / Tech
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話torisoup
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Yoshiaki Shibutani
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ SEGADevTech
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 

What's hot (20)

ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編
 
【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 

Viewers also liked

同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題IGDA Japan
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
Pythonでトヨタカレンダーを読んでみた
Pythonでトヨタカレンダーを読んでみたPythonでトヨタカレンダーを読んでみた
Pythonでトヨタカレンダーを読んでみた学 山本
 
Amon2 で造られた api サーバを引き継いで課金の実装をしました話
Amon2 で造られた api サーバを引き継いで課金の実装をしました話Amon2 で造られた api サーバを引き継いで課金の実装をしました話
Amon2 で造られた api サーバを引き継いで課金の実装をしました話Tomoo Amano
 
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話Tomoo Amano
 
Mojoliciousのログ出力を改造する in chiba.pm #3
Mojoliciousのログ出力を改造する in chiba.pm #3Mojoliciousのログ出力を改造する in chiba.pm #3
Mojoliciousのログ出力を改造する in chiba.pm #3Ayumu Itou
 
Mojolicious+redisでチャットを作った
Mojolicious+redisでチャットを作ったMojolicious+redisでチャットを作った
Mojolicious+redisでチャットを作ったTetsuya Tatsumi
 
PerlでWeb API入門
PerlでWeb API入門PerlでWeb API入門
PerlでWeb API入門Yusuke Wada
 
Mojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみようMojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみようcharsbar
 
Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Yusuke Wada
 
デザインパターン(state,strategy,template)
デザインパターン(state,strategy,template)デザインパターン(state,strategy,template)
デザインパターン(state,strategy,template)tniky1
 
2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情charsbar
 
IOS/Androidアプリの3つの大事な設計方針
IOS/Androidアプリの3つの大事な設計方針IOS/Androidアプリの3つの大事な設計方針
IOS/Androidアプリの3つの大事な設計方針Ken Morishita
 
PSM向けノベルゲームの開発の課題_サークルやまどん
PSM向けノベルゲームの開発の課題_サークルやまどんPSM向けノベルゲームの開発の課題_サークルやまどん
PSM向けノベルゲームの開発の課題_サークルやまどんIGDA Japan
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)charsbar
 
Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changingcharsbar
 
Perl logging
Perl loggingPerl logging
Perl loggingkeroyonn
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 

Viewers also liked (20)

同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Pythonでトヨタカレンダーを読んでみた
Pythonでトヨタカレンダーを読んでみたPythonでトヨタカレンダーを読んでみた
Pythonでトヨタカレンダーを読んでみた
 
Amon2 で造られた api サーバを引き継いで課金の実装をしました話
Amon2 で造られた api サーバを引き継いで課金の実装をしました話Amon2 で造られた api サーバを引き継いで課金の実装をしました話
Amon2 で造られた api サーバを引き継いで課金の実装をしました話
 
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
 
Mojoliciousのログ出力を改造する in chiba.pm #3
Mojoliciousのログ出力を改造する in chiba.pm #3Mojoliciousのログ出力を改造する in chiba.pm #3
Mojoliciousのログ出力を改造する in chiba.pm #3
 
Mojolicious+redisでチャットを作った
Mojolicious+redisでチャットを作ったMojolicious+redisでチャットを作った
Mojolicious+redisでチャットを作った
 
PerlでWeb API入門
PerlでWeb API入門PerlでWeb API入門
PerlでWeb API入門
 
Mojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみようMojolicious::Liteを使ってみよう
Mojolicious::Liteを使ってみよう
 
Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門
 
デザインパターン(state,strategy,template)
デザインパターン(state,strategy,template)デザインパターン(state,strategy,template)
デザインパターン(state,strategy,template)
 
2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情
 
IOS/Androidアプリの3つの大事な設計方針
IOS/Androidアプリの3つの大事な設計方針IOS/Androidアプリの3つの大事な設計方針
IOS/Androidアプリの3つの大事な設計方針
 
PSM向けノベルゲームの開発の課題_サークルやまどん
PSM向けノベルゲームの開発の課題_サークルやまどんPSM向けノベルゲームの開発の課題_サークルやまどん
PSM向けノベルゲームの開発の課題_サークルやまどん
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)
 
Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changing
 
Perl logging
Perl loggingPerl logging
Perl logging
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 

Gofのデザインパターン stateパターン編