【WinForm】中級:シンプルなステートマシンの実装とswitch文との比較
この資料では、WinFormアプリケーションでステートマシンの概念を実装する方法と、switch
文との違いについて学びます。ステートマシンは、状態ごとに異なる動作を行うシステムであり、特定の状態に応じてプログラムの動作を管理するための設計パターンです。switch
文との違いを理解することで、適切な場面での設計選択ができるようになります。
1. アプリケーションの概要
このサンプルアプリケーションには以下のコンポーネントが含まれます。
- Button: 状態を切り替えるためのボタン。
- Label: 現在の状態を表示するラベル。
ボタンをクリックすると、アプリケーションは次の状態に移行し、ラベルの表示が更新されます。
2. ステートマシンの設計
ステートマシンは、以下の3つの状態を持ちます。
- 開始状態(Start State): 初期状態。
- 実行中状態(Running State): ボタンをクリックするとこの状態に移行します。
- 終了状態(End State): もう一度ボタンをクリックするとこの状態に移行します。
各状態はIState
インターフェースを実装するクラスとして定義します。
3. コード実装
3.1 インターフェースの定義
public interface IState
{
void Handle(StateContext context);
string GetStateName();
}
3.2 各状態のクラス
public class StartState : IState
{
public void Handle(StateContext context)
{
context.SetState(new RunningState());
}
public string GetStateName()
{
return "Start State";
}
}
public class RunningState : IState
{
public void Handle(StateContext context)
{
context.SetState(new EndState());
}
public string GetStateName()
{
return "Running State";
}
}
public class EndState : IState
{
public void Handle(StateContext context)
{
context.SetState(new StartState());
}
public string GetStateName()
{
return "End State";
}
}
3.3 状態管理クラス
public class StateContext
{
private IState state;
public StateContext(IState initialState)
{
SetState(initialState);
}
public void SetState(IState newState)
{
state = newState;
}
public void Request()
{
state.Handle(this);
}
public string GetStateName()
{
return state.GetStateName();
}
}
3.4 WinFormの設定
- Button と Label をフォームに配置します。
- ボタンの
Click
イベントに以下のコードを追加します。
public partial class Form1 : Form
{
private StateContext stateContext;
public Form1()
{
InitializeComponent();
stateContext = new StateContext(new StartState());
UpdateStateLabel();
}
private void button1_Click(object sender, EventArgs e)
{
stateContext.Request();
UpdateStateLabel();
}
private void UpdateStateLabel()
{
label1.Text = stateContext.GetStateName();
}
}
4. switch
文との比較
ステートマシンとswitch
文には、似ている点がある一方で、それぞれ異なる特徴があります。
4.1 switch
文の例
enum State
{
Start,
Running,
End
}
State currentState = State.Start;
void HandleState()
{
switch (currentState)
{
case State.Start:
currentState = State.Running;
break;
case State.Running:
currentState = State.End;
break;
case State.End:
currentState = State.Start;
break;
}
}
4.2 比較と使い分け
- 設計の拡張性: ステートマシンは状態をクラスとして定義するため、状態の追加や変更が容易で、オブジェクト指向設計に適しています。一方、
switch
文は簡潔ですが、状態が増えるとコードが複雑になります。 - 責務の分離: ステートマシンでは各状態が独立したクラスとして実装されるため、コードの再利用やテストが容易です。
switch
文は1つの関数にすべてのロジックが詰め込まれるため、変更に弱くなります。 - コードの再利用性: ステートマシンの設計は再利用がしやすく、変更にも柔軟に対応できますが、
switch
文はそれが難しい場合があります。
5. 動作確認
アプリケーションを実行すると、初期状態は「Start State」と表示されます。ボタンをクリックすると「Running State」に、さらにクリックすると「End State」に変わります。その後、再び「Start State」に戻ります。
6. まとめ
この技術資料では、WinFormアプリケーションでシンプルなステートマシンを実装する方法と、switch
文との違いを学びました。状況に応じて、ステートマシンとswitch
文のどちらを使用するかを判断することで、より柔軟で保守しやすいコードを書くことが可能になります。
ディスカッション
コメント一覧
まだ、コメントがありません