Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Application Design 勉強会 #12
Kazuki Chigita
November 11, 2019
Programming
0
33
Application Design 勉強会 #12
状態マシンとStateパターン
Kazuki Chigita
November 11, 2019
Tweet
Share
More Decks by Kazuki Chigita
See All by Kazuki Chigita
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
2
1.4k
継続的に機能開発を進めながら行うマルチモジュール化
chigichan24
2
3.7k
Application Design 勉強会 #10
chigichan24
0
58
Application Design 勉強会 #6
chigichan24
0
75
Application Design 勉強会 #4
chigichan24
0
46
Application Design 勉強会 #2
chigichan24
1
75
Read DroidKaigi2019 app source code
chigichan24
1
330
Battle of GridLayout with RecyclerView
chigichan24
0
170
FlutterでBLEを いい感じにする
chigichan24
2
550
Other Decks in Programming
See All in Programming
Dagger, la CI, autrement
guikingone
1
120
YATA: collaborative documents and how to make them fast
horusiath
2
170
パスワードに関する最近の動向
kenchan0130
1
340
RustのWebフレームワーク周りの概観
hayao
0
190
Steam Deck, Linux Container and the Arch Community
suiong_ng
1
100
Cloudflare WorkersでGoのHTTPサーバーを動かすライブラリを作った話
syumai
0
150
Carp言語さわってみた 〜鯉を取り戻せ編〜
tsin45
0
110
Amazon SageMakerでImagenを動かして猫画像生成してみた
hotoke_neko
0
130
Atomic Design とテストの○○な話
takfjp
2
830
クラウド KMS の活用 / TOKYO BLOCKCHAIN TECH MEETUP 2022
odanado
PRO
0
200
回帰分析ではlm()ではなくestimatr::lm_robust()を使おう / TokyoR100
dropout009
0
4.6k
Another 40 years of Commodore 64
mehowte
0
120
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
316
19k
KATA
mclloyd
7
8.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
Building Your Own Lightsaber
phodgson
95
4.7k
Testing 201, or: Great Expectations
jmmastey
21
5.5k
Agile that works and the tools we love
rasmusluckow
319
19k
Learning to Love Humans: Emotional Interface Design
aarron
261
37k
YesSQL, Process and Tooling at Scale
rocio
157
12k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
212
20k
The World Runs on Bad Software
bkeepers
PRO
57
5.4k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
Rebuilding a faster, lazier Slack
samanthasiow
62
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・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~