誰かがステートマシンの使用例をコンパイラとパーサー以外のソフトウェアで言うことができますか?実用的に重要な例があり、ステートマシンの使用例はソフトウェアを簡素化する必要があります:-)状態マシンの例
.NETアプリケーションを作成したいと思います。
ありがとうございました。
誰かがステートマシンの使用例をコンパイラとパーサー以外のソフトウェアで言うことができますか?実用的に重要な例があり、ステートマシンの使用例はソフトウェアを簡素化する必要があります:-)状態マシンの例
.NETアプリケーションを作成したいと思います。
ありがとうございました。
あなたが見るすべてのUIを1つの大きな状態マシンと考えることができます。 UIからのすべてのイベント(例えば、ボタンのクリック、メニューの選択など)は、別の状態への移行を駆動し、新しいページを意味する可能性があります。
もう1つのシナリオは発注です。新しい注文(新しい状態)はキャンセルまたは変更できますが、払い戻しはできません。しかし、いったん完了した状態にすると取り消すことはできませんが、返金される可能性があります。
何らかの形で状態機械としても考えられます。左シフト、定数の加算、定数の乗算などの入力があります。状態は実際の現在のランダムな値です。このような乱数の数は有限であるため、ある種の有限状態機械と考えることができます。
OSカーネルスケジューラ/ディスパッチャは、ステートマシンです。スレッドには実行中、実行中、スリープ中、eventWaiting、中断中、終了済みの状態があります。イベントは、IOデバイスドライバからのハードウェア割り込みと、実行中のスレッドからのソフトウェア割り込みです。
典型的なナビゲーションパスを示すウェブサイトのデザイン(@ duffymoの回答に似ています)。ここでは((クレイグ・ラーマン) "UMLとパターンの適用" からインスピレーションを得た)不完全な例です:
運河のロックソフトウェア: (Umpleで表される)ステートマシンのいくつかの例を参照してください
http://cruise.eecs.uottawa.ca/umpleonline/?example=CanalLockStateMachine&diagramtype=state
テレコムコール処理: http://cruise.eecs.uottawa.ca/umpleonline/?example=Phone&diagramtype=state
ガレージドアソフトウェア: 航空会社の予約システムでhttp://cruise.eecs.uottawa.ca/umpleonline/?example=GarageDoor&diagramtype=state
予約: http://cruise.eecs.uottawa.ca/umpleonline/?example=Booking&diagramtype=state
のOpenGLライブラリは、ステートマシンです。ライブラリ関数の呼び出しに応じて変化するステータスを保持します。あなたはここにそれを見ることができます:http://www.cs.tufts.edu/research/graphics/resources/OpenGL/OpenGL.htm
ビデオゲームでは、状態マシンが使用できるもう1つの範囲があります。比較的知的な敵を想像してみてください。この敵は、攻撃、隠れ、死にます、走っているなどのいくつかのステータスを持ちます。これは、州やイベントによって制御できます。私の学位プロジェクトとしてビデオゲームを書きましたが、ゲームの流れ(プレゼンテーション画面、ゲーム、オプションなど)とゲーム自体の2つの状態マシン(質問をしたり、サイコロを投げたり、プレイヤーを移動させるなど)
基本的なFSMのおもちゃコンソールアプリケーションの例です。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// DESC: QAD-FSM (Quick And Dirty Finite State Machine)
//
// Notes: In its simplest form a state machine is
// • A set of states
// • A set of events
// • A set of transitions that define
// the next state given the current state and event.
// • A method of tracking current state
//
// Example:
//
// I want to create a different kind of door lock that
// has the following states:
//
// 1. LBS - Locked_Both_Sides
// 2. UBS - Unlocked_Both_Sides
// 3. LFO - Locked_From_Outside
//
// and has the following events:
//
// 1. OKT - Outside Key Turn
// 2. IKT - Inside Key Turn
//
// Transistions will be as follows:
//
// CurrState Event NextState Desc
// ========================================================
// LBS OKT UBS When both sides locked, outside key turn unlocks both sides
// LBS IKT LFO When both sides locked, inside key turn unlocks inside
// UBS OKT LFO When both sides unlocked, outside key turn locks outside
// UBS IKT LBS When both sides unlocked, inside key turn locks both sides
// LFO OKT UBS When only outside locked, outside key turn unlocks outside
// LFO IKT LBS When only outside locked, inside key turn locks both sides.
namespace FSM
{
// The FSM states
enum State
{
LBS,
UBS,
LFO
}
// The FSM events
enum Event
{
IKT,
OKT
}
class Transition
{
public State currState { get; set; }
public Event evnt { get; set; }
public State nextState { get; set; }
}
class Program
{
static void Main(string[] args)
{
var fsm = new FSM();
System.Console.WriteLine("Current State: " + fsm.StateDesc[fsm.CurrentState]);
string input = "";
while (input != "x")
{
System.Console.Write("Enter key turn [IKT, OKT] or x to exit: ");
input = System.Console.ReadLine();
if (input == "x") break;
Event evnt;
if (!Enum.TryParse(input, out evnt))
{
System.Console.WriteLine("Invalid input: " + input + ", enter one of [IKT,OKT,x]");
continue;
}
fsm.ChangeState(evnt);
System.Console.WriteLine("New State: " + fsm.StateDesc[fsm.CurrentState]);
}
System.Console.WriteLine("");
System.Console.WriteLine("History");
System.Console.WriteLine("===============================================");
System.Console.WriteLine("CurrState(Event) => NextState");
System.Console.WriteLine("===============================================");
fsm.hist
.Select(h => h.currState.ToString() + "(" + h.evnt.ToString() + ") => " + h.nextState.ToString())
.ToList()
.ForEach(h => System.Console.WriteLine(h));
}
}
class FSM
{
public Dictionary<State, String> StateDesc = new Dictionary<State, String>()
{
{State.LBS, "Both Sides Locked"},
{State.LFO, "Locked From Outside"},
{State.UBS, "Both Sides Unlocked"}
};
public List<Transition> hist = new List<Transition>();
// Create FSM transitions.
List<Transition> trans = new List<Transition>
{
new Transition() { currState = State.LBS, evnt = Event.OKT, nextState = State.UBS },
new Transition() { currState = State.LBS, evnt = Event.IKT, nextState = State.LFO },
new Transition() { currState = State.UBS, evnt = Event.OKT, nextState = State.LFO },
new Transition() { currState = State.UBS, evnt = Event.IKT, nextState = State.LBS },
new Transition() { currState = State.LFO, evnt = Event.OKT, nextState = State.UBS },
new Transition() { currState = State.LFO, evnt = Event.IKT, nextState = State.LBS },
};
public State CurrentState { get { var lt = hist.FirstOrDefault(); return lt == null ? State.UBS : lt.nextState; } }
public State? ChangeState(Event evnt)
{
var t = trans.Find(r => r.currState == CurrentState && r.evnt == evnt);
if (t == null) return null; // If you don't create transitions that cover all combinations this could happen.
hist.Insert(0, t);
return t.nextState;
}
}
}
http://stackoverflow.com/questions/255797/uses-for-state-machinesを参照してください。確かに分かりませんが、重複はありません – CharlesB