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
280
Flutterと難読化
chigichan24
0
4.2k
Building Android and looking into the Android System
chigichan24
2
4k
DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから
chigichan24
3
3.3k
継続的に機能開発を進めながら行うマルチモジュール化
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
250
Other Decks in Programming
See All in Programming
Оптимизируем производительность блока Казначейство
lamodatech
0
990
React 19でお手軽にCSS-in-JSを自作する
yukukotani
5
600
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
140
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
120
WebDriver BiDiとは何なのか
yotahada3
1
100
DMMオンラインサロンアプリのSwift化
hayatan
0
270
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
7
1.5k
ecspresso, ecschedule, lambroll を PipeCDプラグインとして動かしてみた (プロトタイプ) / Running ecspresso, ecschedule, and lambroll as PipeCD Plugins (prototype)
tkikuc
2
2.3k
ASP.NET Core の OpenAPIサポート
h455h1
0
160
Azure AI Foundryのご紹介
qt_luigi
1
260
shadcn/uiを使ってReactでの開発を加速させよう!
lef237
0
390
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
3
3.7k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
270
GitHub's CSS Performance
jonrohan
1030
460k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
Navigating Team Friction
lara
183
15k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
BBQ
matthewcrist
85
9.4k
Faster Mobile Websites
deanohume
305
30k
Why Our Code Smells
bkeepers
PRO
335
57k
Embracing the Ebb and Flow
colly
84
4.5k
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・マーチン:
アジャイルソフトウェア開発の奥義 ~オブジェクト指向開発の真髄と匠の技~