Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Application Design 勉強会 #12
Search
Kazuki Chigita
November 11, 2019
Programming
0
61
Application Design 勉強会 #12
状態マシンとStateパターン
Kazuki Chigita
November 11, 2019
Tweet
Share
More Decks by Kazuki Chigita
See All by Kazuki Chigita
不具合調査とTest
chigichan24
1
240
Flutterと難読化
chigichan24
0
4.1k
Building Android and looking into the Android System
chigichan24
2
4k
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
3
3.2k
継続的に機能開発を進めながら行うマルチモジュール化
chigichan24
2
5.8k
Application Design 勉強会 #10
chigichan24
0
84
Application Design 勉強会 #6
chigichan24
0
170
Application Design 勉強会 #4
chigichan24
0
160
Application Design 勉強会 #2
chigichan24
1
240
Other Decks in Programming
See All in Programming
nekko cloudにおけるProxmox VE利用事例
irumaru
3
450
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
110
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
8
1.9k
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
340
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
450
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
390
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
950
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
230
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
570
快速入門可觀測性
blueswen
0
400
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築
sumiyae
2
410
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
1
110
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Gamification - CAS2011
davidbonilla
80
5.1k
What's in a price? How to price your products and services
michaelherold
244
12k
Code Review Best Practice
trishagee
65
17k
Designing Experiences People Love
moore
138
23k
Done Done
chrislema
182
16k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
We Have a Design System, Now What?
morganepeng
51
7.3k
Transcript
Application Design 勉強会 #12 Mon Nov 11 Kazuki Chigita
プログラム上で有限状態マシンを考えたいことがある. 導入
プログラム上で有限状態マシンを考えたいことがある. 導入 振る舞いを直接的にノードとエッジを用いて示す. → 状態遷移図(STD : State Transition Diagram)とも呼ばれる
状態遷移図 Locked Unlocked coin/unlock pass/lock
状態遷移図 Locked Unlocked coin/unlock pass/lock 状態 遷移 イベント アクション
状態遷移図 Locked Unlocked coin/unlock pass/lock 状態 遷移 イベント アクション index
state event next action 1 Locked coin Unlocked unlock 2 Unlocked pass Locked lock ...
状態遷移図 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)
プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる
プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる
プログラムでどう表現するか? 1. switch / case を二重入れ子にする 1つ目では状態に対してswitch 2つ目ではイベントに対してswitch actionの詳細は外部に投げることができる. (interfaceで切ることもできる)
Switchでの分岐が多く拡張性がつらい Stateをstaticで持つ必要があり, 状態が分離できない
プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる
プログラムでどう表現するか? 2. 遷移テーブルを実装する ← テーブル情報を登録 遷移関係がシンプルで,一箇所に 集まっている. Eventによる遷移の計算量
プログラムでどう表現するか? 1. switch / case を二重入れ子にする 2. 遷移テーブルを実装する 3. Stateパターンを用いる
プログラムでどう表現するか? 3. Stateパターンを用いる Contextとも呼ぶ
プログラムでどう表現するか? 3. Stateパターンを用いる
プログラムでどう表現するか? 3. Stateパターンを用いる 状態マシンのアクション部分と, 論理部部を分離できる 計算量が小さい Stateの実装は,状態が増えれば 増えるほどその分実装する必要がある 一覧でactionを見ることができない
プログラムでどう表現するか? 3+α. Stateパターン+状態マシンコンパイラを用いる
プログラムでどう表現するか? 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
プログラムでどう表現するか? 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
プログラムでどう表現するか? 手で実装するのはここだけ
GUIのあるログイン画面の状態と表示画面を制御したい 利用例
GUIのあるログイン画面の状態と表示画面を制御したい 利用例 Initial init { init { start logginIn displayLoginScreen
} logginIn { enter checkingPassword checkPassword cancel init clearScreen } checkingPassword { passwordGood loggedIn startUserProcess passwordBad notifyingPasswordBad displayBadPasswordScreen thirdBadPassword screenLocked displayLockScreen } ... }
- Stateパターンは状態マシンを表現するのに有効だが, 状態をAuto Generate(例:コンパイラ)するものがないと難しい. まとめ - コンパイラは,http://www.objectmentor.com にある. 参考文献 ロバート・C・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~