概要
Ruby の state_machines gem を使ってオブジェクトの状態遷移を行ってみました
動きを確認できる簡単なサンプルコードを紹介します
環境
- macOS 11.6.8
- Ruby 3.1.2p20
- state_machines 0.5.0
インストール
- vim Gemfile
gem "state_machines"
- bundle install
サンプルコード
require 'state_machines'
class Instance
# 初期状態を定義します
# 今回は初期状態は wait とします
# イベントによる遷移先の定義はブロック内で行います
# 今回は wait -> creating -> running というシンプルな状態遷移を考えます
state_machine :state, initial: :wait do
# run がコールされたら creating 状態にします (インスタンスの作成)
event :run do
transition wait: :creating
end
# complete がコールされたら running 状態にします (インスタンスの作成完了)
event :completed do
transition creating: :running
end
# cancel がコールされたら wait 状態にします (インスタンスの作成キャンセル)
event :cancel do
transition creating: :wait
end
# delete がコールされた wait 状態にします (インスタンスの削除)
event :delete do
transition running: :wait
end
end
end
# 動作確認
ins = Instance.new
puts ins.state # => wait
ins.run
puts ins.creating? # => true
ins.completed
puts ins.running? # => true
ins.delete
puts ins.wait? # => true
ins.run
ins.cancel
puts ins.wait? # => true
少し解説
コード内のコメントを追うのが一番いいかなと思うので少しだけ補足します
event メソッドで状態が遷移するイベントを定義します
そのイベントが発生したら transition で状態の遷移先を定義します
transition は「今の状態」「次の状態」という2つの引数で定義します
もし今の状態からの遷移先がない場合は現在の状態に留まります (例えば wait 状態で cancel イベントが発生しても wait のまま)
最後に
次回はこの Ruby ファイルから状態遷移図を作成する方法を紹介します
0 件のコメント:
コメントを投稿