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

研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイするTakayuki Itoh
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることShingo Fukui
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得Reimi Kuramochi Chiba
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。toshihiro ichitani
 
機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018Takahiro Kubo
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-Deep Learning JP
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」Ken'ichi Matsui
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
落合流先生流の論文要旨フォーマット
落合流先生流の論文要旨フォーマット落合流先生流の論文要旨フォーマット
落合流先生流の論文要旨フォーマット森 哲也
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 

What's hot (20)

研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
WayOfNoTrouble.pptx
WayOfNoTrouble.pptxWayOfNoTrouble.pptx
WayOfNoTrouble.pptx
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
落合流先生流の論文要旨フォーマット
落合流先生流の論文要旨フォーマット落合流先生流の論文要旨フォーマット
落合流先生流の論文要旨フォーマット
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 

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パターン編