Application Design 勉強会 #12

Application Design 勉強会 #12

状態マシンとStateパターン

A445824f9bb334ec104f5c1c7b67fee2?s=128

Kazuki Chigita

November 11, 2019
Tweet

Transcript

  1. Application Design 勉強会 #12 Mon Nov 11 Kazuki Chigita

  2. プログラム上で有限状態マシンを考えたいことがある. 導入

  3. プログラム上で有限状態マシンを考えたいことがある. 導入 振る舞いを直接的にノードとエッジを用いて示す. → 状態遷移図(STD : State Transition Diagram)とも呼ばれる

  4. 状態遷移図 Locked Unlocked coin/unlock pass/lock

  5. 状態遷移図 Locked Unlocked coin/unlock pass/lock 状態 遷移 イベント アクション

  6. 状態遷移図 Locked Unlocked coin/unlock pass/lock 状態 遷移 イベント アクション index

    state event next action 1 Locked coin Unlocked unlock 2 Unlocked pass Locked lock ...
  7. 状態遷移図 Locked Unlocked coin/unlock pass/lock 状態 遷移 イベント アクション index

    state event next action 1 Locked coin Unlocked unlock 2 Unlocked pass Locked lock ... 状態遷移テーブル (STT : State Transition Table)
  8. プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる

  9. プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる

  10. プログラムでどう表現するか? 1. switch / case を二重入れ子にする 1つ目では状態に対してswitch 2つ目ではイベントに対してswitch actionの詳細は外部に投げることができる. (interfaceで切ることもできる)

    Switchでの分岐が多く拡張性がつらい Stateをstaticで持つ必要があり, 状態が分離できない
  11. プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる

  12. プログラムでどう表現するか? 2. 遷移テーブルを実装する ← テーブル情報を登録 遷移関係がシンプルで,一箇所に 集まっている. Eventによる遷移の計算量

  13. プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる

  14. プログラムでどう表現するか? 3. Stateパターンを用いる Contextとも呼ぶ

  15. プログラムでどう表現するか? 3. Stateパターンを用いる

  16. プログラムでどう表現するか? 3. Stateパターンを用いる 状態マシンのアクション部分と, 論理部部を分離できる 計算量が小さい Stateの実装は,状態が増えれば 増えるほどその分実装する必要がある 一覧でactionを見ることができない

  17. プログラムでどう表現するか? 3+α. Stateパターン+状態マシンコンパイラを用いる

  18. プログラムでどう表現するか? 3+α. Stateパターン+状態マシンコンパイラを用いる FSMName Turnstile Context TrunstileActions Intial Locked Exception

    FsmError { Locked { coin Unlocked unlock pass Locked alarm } Unloked { coin Unlocked thankyou pass Locked lock } } Auto Generate
  19. プログラムでどう表現するか? 3+α. Stateパターン+状態マシンコンパイラを用いる FSMName Turnstile Context TrunstileActions Intial Locked Exception

    FsmError { Locked { coin Unlocked unlock pass Locked alarm } Unloked { coin Unlocked thankyou pass Locked lock } } Auto Generate
  20. プログラムでどう表現するか? 手で実装するのはここだけ

  21. GUIのあるログイン画面の状態と表示画面を制御したい 利用例

  22. GUIのあるログイン画面の状態と表示画面を制御したい 利用例 Initial init { init { start logginIn displayLoginScreen

    } logginIn { enter checkingPassword checkPassword cancel init clearScreen } checkingPassword { passwordGood loggedIn startUserProcess passwordBad notifyingPasswordBad displayBadPasswordScreen thirdBadPassword screenLocked displayLockScreen } ... }
  23. - Stateパターンは状態マシンを表現するのに有効だが, 状態をAuto Generate(例:コンパイラ)するものがないと難しい. まとめ - コンパイラは,http://www.objectmentor.com にある. 参考文献 ロバート・C・マーチン:

    アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~