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
79
Application Design 勉強会 #12
状態マシンとStateパターン
Kazuki Chigita
November 11, 2019
Tweet
Share
More Decks by Kazuki Chigita
See All by Kazuki Chigita
Live Update notificationのつかいどころ
chigichan24
0
230
不具合調査とTest
chigichan24
1
390
Flutterと難読化
chigichan24
0
5k
Building Android and looking into the Android System
chigichan24
2
4.1k
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
3
3.4k
継続的に機能開発を進めながら行うマルチモジュール化
chigichan24
2
6k
Application Design 勉強会 #10
chigichan24
0
95
Application Design 勉強会 #6
chigichan24
0
200
Application Design 勉強会 #4
chigichan24
0
230
Other Decks in Programming
See All in Programming
さようなら Date。 ようこそTemporal! 3年間先行利用して得られた知見の共有
8beeeaaat
3
1.4k
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.2k
Swift Updates - Learn Languages 2025
koher
2
470
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
6
2.3k
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
200
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
100
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
21
5.6k
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
19
11k
Design Foundational Data Engineering Observability
sucitw
3
190
Cache Me If You Can
ryunen344
1
600
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.2k
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
7
1.1k
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
40
2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Visualization
eitanlees
148
16k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
111
20k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Fireside Chat
paigeccino
39
3.6k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
920
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
How to Ace a Technical Interview
jacobian
279
23k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
520
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
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・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~