Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Application Design 勉強会 #12

Application Design 勉強会 #12

状態マシンとStateパターン

Kazuki Chigita

November 11, 2019
Tweet

More Decks by Kazuki Chigita

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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)

    View Slide

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

    View Slide

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

    View Slide

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


    Stateをstaticで持つ必要があり,
    状態が分離できない

    View Slide

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

    View Slide

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

    Eventによる遷移の計算量

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. プログラムでどう表現するか?
    3. Stateパターンを用いる
    状態マシンのアクション部分と,
    論理部部を分離できる

    計算量が小さい

    Stateの実装は,状態が増えれば
    増えるほどその分実装する必要がある

    一覧でactionを見ることができない

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  20. プログラムでどう表現するか?
    手で実装するのはここだけ

    View Slide

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

    View Slide

  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
    }
    ...
    }

    View Slide

  23. - Stateパターンは状態マシンを表現するのに有効だが,
    状態をAuto Generate(例:コンパイラ)するものがないと難しい.
    まとめ
    - コンパイラは,http://www.objectmentor.com にある.
    参考文献
    ロバート・C・マーチン:
    アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~

    View Slide