【ITニュース解説】The State Design pattern in C++ using timer and notification
2025年09月07日に「Dev.to」が公開したITニュース「The State Design pattern in C++ using timer and notification」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
C++でStateデザインパターンを実装する例を紹介。オブジェクトの状態に応じて振る舞いを変更する。この記事では、鶏肉の調理プロセスを例に、未洗浄、洗浄済、マリネ、調理済という状態遷移を、タイマーと通知を使って実現する方法を示す。状態の変更はイベントによってトリガーされる。
ITニュース解説
このニュース記事は、C++におけるStateデザインパターンを、具体的な料理のプロセス(鶏肉の調理)を例に説明している。Stateパターンは、オブジェクトの状態に応じて振る舞いを変化させるためのデザインパターンだ。オブジェクトが取りうる状態をそれぞれクラスとして定義し、状態間の遷移を管理することで、複雑な条件分岐を減らし、コードを整理するのに役立つ。
記事で示されているコードは、鶏肉の状態を「Uncleaned(未洗浄)」「Cleaned(洗浄済)」「Marinated(マリネ済)」「Cooked(調理済)」の4つの状態としてモデル化している。それぞれの状態はChickenStateという抽象クラスを継承したクラスとして実装されている。
ChickenStateクラスは、wash(), marinate(), cook(), serve(), goToNextState(), getTag()といった仮想関数を持つ。これらの関数は、各状態における鶏肉に対する操作と、状態遷移を定義する。例えば、UncleanedStateクラスのwash()関数は、鶏肉を洗浄する処理を記述し、洗浄が完了したら次の状態(CleanedState)へ遷移する。
Mammaクラスは、料理のコンテキスト(文脈)を表すクラスだ。このクラスは、現在の鶏肉の状態を保持し、状態の変更を管理する。MammaクラスはChickenStateへのポインタを持ち、changeChickenState()メソッドで状態を切り替える。startPreparation()メソッドは、現在の状態に応じて適切な操作(wash(), marinate()など)を呼び出す。
記事のコードでは、状態遷移をタイマーを使って実現している点が特徴的だ。各状態の処理(例えば洗浄)には時間がかかるため、setTimeout()関数を使って指定時間後に次の状態へ遷移するようになっている。Timerクラスは、指定された時間後に指定された関数を実行する機能を提供する。Timerクラスは、スレッドを使って非同期的に動作し、メインスレッドをブロックしない。
Callbackクラスは、タイマーが完了したときにMammaクラスに通知するためのインターフェースを提供する。MammaクラスはCallbackインターフェースを実装し、goToNextStateFromCallback()メソッドで次の状態への遷移を処理する。
具体的なコードの流れは以下のようになる。
main()関数でMammaオブジェクトが生成される。初期状態はUncleanedState。MammaオブジェクトのstartPreparation()メソッドが呼び出される。startPreparation()メソッドは、現在の状態(UncleanedState)に応じてwash()メソッドを呼び出す。wash()メソッドは、鶏肉を洗浄する処理(ここでは単にメッセージを表示するだけ)を行い、setTimeout()関数を使って3秒後にgoToNextState()メソッドが呼び出されるように設定する。- 3秒後、
goToNextState()メソッドが呼び出され、Mammaオブジェクトの状態がCleanedStateに遷移する。 MammaオブジェクトのstartPreparation()メソッドが再び呼び出され、今度はCleanedStateに応じた処理(marinate()メソッドの呼び出し)が行われる。- このプロセスが繰り返され、鶏肉の状態は
CleanedState、MarinatedState、CookedStateへと遷移していく。 - 最終的に
CookedStateのserve()メソッドが呼び出され、調理完了のメッセージが表示される。
この例では、Stateパターンを使うことで、鶏肉の状態とそれに応じた処理を明確に分離し、コードの見通しを良くしている。状態遷移のロジックもMammaクラスに集約されているため、変更や拡張が容易になる。
システムエンジニアを目指す初心者がStateパターンを理解する上で重要な点は、以下の通りだ。
- オブジェクトの状態に応じて異なる振る舞いをさせたい場合に有効なパターンである。
- 状態をクラスとして定義することで、状態ごとの処理を明確に分離できる。
- 状態遷移のロジックを集中管理することで、コードの保守性を高めることができる。
- タイマーやイベント駆動のシステムと組み合わせることで、複雑な状態遷移を実装できる。
このニュース記事の例では、料理という身近なプロセスをStateパターンを使ってモデル化することで、抽象的なデザインパターンの概念を理解しやすくしている。C++のコード例も提供されているため、実際にコードを動かしてみることで、より深くStateパターンを理解できるだろう。