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
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.1k
「 動く」サンプルでスムーズなコミュニケーションを
chigichan24
1
1k
Claude CodeでサクサクTestコードを移行しよう
chigichan24
2
1.3k
Live Update notificationのつかいどころ
chigichan24
0
330
不具合調査とTest
chigichan24
1
450
Flutterと難読化
chigichan24
0
5.6k
Building Android and looking into the Android System
chigichan24
2
4.2k
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
2
3.5k
継続的に機能開発を進めながら行うマルチモジュール化
chigichan24
2
6.2k
Other Decks in Programming
See All in Programming
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
140
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
370
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
430
書き換えて学ぶTemporal #fukts
pirosikick
2
370
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
3k
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
28
22k
検索設計から 推論設計への重心移動と Recall-First Retrieval
po3rin
5
1.7k
クラウドネイティブなエンジニアに向ける Raycastの魅力と実際の活用事例
nealle
2
260
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
460
SREに優しいTerraform構成 modulesとstateの組み方
hiyanger
2
180
AI時代になぜ書くのか
mutsumix
0
400
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
1.8k
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Marketing to machines
jonoalderson
1
5.3k
Designing Experiences People Love
moore
143
24k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Code Review Best Practice
trishagee
74
20k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
140
Prompt Engineering for Job Search
mfonobong
0
300
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
130
Raft: Consensus for Rubyists
vanstee
141
7.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
120
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・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~