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

グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門Kawamoto_Kazuhiko
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)Preferred Networks
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用Hiroyuki Masuda
 
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic DatasetsDeep Learning JP
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)Ayako_Hasegawa
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Yusuke Fujimoto
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?Fumihiko Takahashi
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門KnowledgeGraph
 
さらば!データサイエンティスト
さらば!データサイエンティストさらば!データサイエンティスト
さらば!データサイエンティストShohei Hido
 
Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介Kuninobu SaSaki
 
国際会議運営記
国際会議運営記国際会議運営記
国際会議運営記Takayuki Itoh
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 

What's hot (20)

グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門
 
研究効率化Tips Ver.2
研究効率化Tips Ver.2研究効率化Tips Ver.2
研究効率化Tips Ver.2
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用
 
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門
 
さらば!データサイエンティスト
さらば!データサイエンティストさらば!データサイエンティスト
さらば!データサイエンティスト
 
GPT解説
GPT解説GPT解説
GPT解説
 
Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介
 
国際会議運営記
国際会議運営記国際会議運営記
国際会議運営記
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 

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