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
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Application Design 勉強会 #12
状態マシンとStateパターン
Kazuki Chigita
November 11, 2019
More Decks by Kazuki Chigita
See All by Kazuki Chigita
あの日のHotReloadはなぜ動かなかったのか? 〜OSセキュリティ(W^X)とJITコンパイラの攻防〜
chigichan24
3
1.2k
「 動く」サンプルでスムーズなコミュニケーションを
chigichan24
1
1.2k
Claude CodeでサクサクTestコードを移行しよう
chigichan24
2
1.4k
Live Update notificationのつかいどころ
chigichan24
0
350
不具合調査とTest
chigichan24
1
460
Flutterと難読化
chigichan24
0
5.7k
Building Android and looking into the Android System
chigichan24
2
4.2k
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
2
3.5k
継続的に機能開発を進めながら行うマルチモジュール化
chigichan24
2
6.3k
Other Decks in Programming
See All in Programming
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1k
ふつうのFeature Flag実践入門
irof
8
4.2k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
OSもどきOS
arkw
0
590
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
410
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
140
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
120
The NotImplementedError Problem in Ruby
koic
1
940
どこまでゆるくて許されるのか
tk3fftk
0
220
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Designing for humans not robots
tammielis
254
26k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
740
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
WENDY [Excerpt]
tessaabrams
11
38k
Ruling the World: When Life Gets Gamed
codingconduct
0
260
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Building the Perfect Custom Keyboard
takai
2
800
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
370
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
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・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~