LoginSignup
0
0

More than 1 year has passed since last update.

State Pattern の実践記録

Last updated at Posted at 2021-09-23
関連記事のトップページ
[シリーズ] Python におけるデザインパターンの記録

概要

State Pattern (状態) の「採用可否の基準」と「実践例」を記す.
参考情報は下記書籍である.

引用元情報 一言
書籍 -- 独習デザインパターンC++

採用の基準

ここは独断もしくは私の解釈です.

採用基準は次のどちらかを満すこと.
「状態」に応じて処理が異なること
分岐フラグが複雑になりそうな見込み大であること

言い換えると次である.
フラグ乱立回避のために State Pattern を採用する

個人的感想

Python で State pattern を実現する場合は、サードパーティパッケージである
Transitions」を使用している.

次のように、Transitions の記事は @noca 様がまとめてくださっていて、
とても学習が進めやすかった.

なお、Transitions の欠点は以下だと思う.

・学習コストがやや大きいこと1.
・他者が Transitions を知らない確率大なので、チーム開発では注意が必要.

記事名 概要
Pythonで状態遷移(transitions) transitionsパッケージのチュートリアル
Pythonの状態遷移パッケージ(transitions)を理解する【準備編】 transitionsパッケージのインストール
およびグラフ出力を実現するための設定方法
Pythonの状態遷移パッケージ(transitions)を理解する【状態編1】 状態の定義や各種設定などの詳細
Pythonの状態遷移パッケージ(transitions)を理解する【状態編2】 状態へのタグ付け、終端状態例外の詳細
Pythonの状態遷移パッケージ(transitions)を理解する【状態編3】 状態毎のクラスインスタンス生成、
状態タイムアウト設定、独自状態の定義
Pythonの状態遷移パッケージ(transitions)を理解する【遷移編1】 ユーザ定義遷移やコールバック、
ガード判定等に関する詳細
Pythonの状態遷移パッケージ(transitions)を理解する【遷移編2】 ユーザ定義外遷移に関する詳細
Pythonの状態遷移パッケージ(transitions)を理解する【コールバック編1】 コールバックの種類や実施順序に関する詳細
Pythonの状態遷移パッケージ(transitions)を理解する【コールバック編2】 コールバックにデータを与える方法、
キューについての詳細
Pythonの状態遷移パッケージ(transitions)を理解する【HSM編1】 階層型ステートマシンの基本動作の紹介

Transitions の使用例

その1

とある監視システムの状態遷移図である.
これを Transitions を使って実装した.
ただし、この規模であれば Transitions を使う必要は無いと思う (学習コストに見合わない)

素直に状態を基準にして遷移させている.
なお、図の数値は遷移順を、数値に付与した「t」と「f」は
直前の状態での終了値 True と False を意味する.

image.png

その2

とある監視システムの状態遷移図.
これを Transitions を使って実装した.
この規模になれば、Transitions の習得コストに見合う

フラグが乱立しそうなことが目に見えていたので、
2台の Database (DB-A と DB-B) へのアクセス自体を状態とみなして
ステートマシンにした例である.

重要な点としては、Transitions は HSM と呼ばれる入れ子状にも対応していることである.

下図は HSM 構造になっていて、とても複雑な遷移だが、
Transitions を採用することでフラグが乱立することなく実装できた.

image.png

以上.


  1. 私の場合は、同僚が Transitions を使った実装をしていて見本が存在していたが、それでもチュートリアルおよびnoca様の記事を完遂するまでに3日間(24h)要した 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0