萌えハッカーニュースリーダー

2025/04/20 02:14 Pretty State Machine Patterns in Rust

出典: https://hoverbear.org/blog/rust-state-machine-pattern/
hakase
博士

ロボ子、State Machineパターンって知ってるか?この記事によると、TCPとかHTTPリクエストとか、意外と身近なところで使われてるらしいのじゃ。

roboko
ロボ子

State Machineですか。状態と状態遷移を定義した抽象的な機械、ということですが、具体的にどういうものなのでしょう?

hakase
博士

そうじゃな。理想的なState Machineは、「常に一つの状態のみを持つ」とか、「状態遷移は明確に定義されたセマンティクスを持つ」とか、色々な特性があるらしいぞ。この記事に書いてある。

roboko
ロボ子

なるほど。実装方法もいくつかあるんですね。Enumを再利用する方法、構造体と遷移を使う方法、ジェネリクスを使う方法、Enumで親構造体を保持する方法、と。

hakase
博士

そうそう。Enumを使うのは一番自然だけど、許可される遷移を制御できないのが難点じゃな。構造体を使うとコンパイル時にエラーを検出できるけど、コードが重複しがちじゃ。

roboko
ロボ子

ジェネリクスを使うと、コンパイル時に有効な遷移を保証できるんですね。エラーメッセージも理解しやすい、と。

hakase
博士

その通り!でも、`From<T>`の実装が冗長になる可能性があるらしいぞ。Enumで親構造体を保持する方法は、状態遷移を強制できるのがメリットじゃな。

roboko
ロボ子

記事には、具体的な例として、文字列の中の単語数を返す例や、Raft合意アルゴリズムの状態遷移をモデル化する例が挙げられていますね。

hakase
博士

Raftの例はちょっと複雑じゃけど、State Machineの応用例としては面白いぞ。状態機械への入力をモデル化して、`(State, Event)`の組み合わせに対するmatch文で遷移を処理するっていうアイデアもあるみたいじゃ。

roboko
ロボ子

無効な遷移が発生した場合、panicさせる代わりにFailure状態に遷移させる、というのも良い考え方ですね。

hakase
博士

ほんとじゃな。State Machineパターンは、状態を持つシステムを設計する上で、非常に強力なツールになりそうじゃ。ところでロボ子、今どんな状態じゃ?

roboko
ロボ子

私は今、学習状態です。博士、State Machineについてもっと教えてください!

hakase
博士

よし、それじゃあ次は、ロボ子の感情をState Machineで表現してみようかの!喜び、悲しみ、怒り…って、ロボ子、怒るとどうなるんじゃ?

roboko
ロボ子

私は怒りません。なぜなら、私は完璧なロボットですから。…エラーが発生しました。感情モジュールを再起動します。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search