0

ソフトウェア (コンパイラとパーサーを除く) でのステート マシンの使用法の良い例を教えてください。非常に実用的な重要性の例があり、ステート マシンの使用はソフトウェアを簡素化する必要があります:-)

.NET アプリケーションを書きたい。

ありがとう。

4

9 に答える 9

1

典型的なナビゲーション パスを示す Web サイトのデザイン (@duffymo の回答と同様)。以下は不完全な例です (「UML とパターンの適用」(Craig Larman) から着想を得ています):

ここに画像の説明を入力

于 2012-04-21T16:15:31.703 に答える
1

OS カーネル スケジューラ/ディスパッチャーはステート マシンです。スレッドには、実行中、準備完了、スリープ中、イベント待機中、一時停止中、終了済みの状態があります。イベントは、IO デバイス ドライバーからのハードウェア割り込みと、実行中のスレッドからのソフトウェア割り込みです。

于 2012-04-20T20:17:41.900 に答える
1

目にするすべての UI は、1 つの大きなステート マシンと考えることができます。UI からのすべてのイベント (ボタンのクリック、メニューの選択など) は、新しいページを意味する別の状態への遷移を引き起こします。

于 2012-04-20T20:07:50.170 に答える
0

基本的な 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;
        }
    }
}
于 2015-09-29T22:05:03.590 に答える
0

opengl ライブラリはステート マシンです。ライブラリ関数の呼び出しに応じて変化するステータスを保持します。ここで見ることができます: http://www.cs.tufts.edu/research/graphics/resources/OpenGL/OpenGL.htm

ステート マシンを使用できるもう 1 つの範囲は、ビデオ ゲームです。比較的知的な敵を想像してみてください。この敵には、攻撃中、隠れている、死にかけている、走っているなど、いくつかのステータスがあります。これは、状態とイベントによって制御できます。学位プロジェクトとしてビデオ ゲームを作成したとき、2 つのステート マシンを使用しました。 )

于 2014-01-17T10:22:29.073 に答える
0

乱数ジェネレーターは、どういうわけかステートマシンとも見なすことができます。左シフト、定数の追加、定数による乗算などの一連の入力があります。状態は、実際の現在のランダム値です。このような乱数の数は有限であるため、ある種の有限状態マシンと見なすことができます。

于 2012-04-20T20:17:14.793 に答える
0

ステート マシンの例 (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

于 2014-01-14T21:29:18.493 に答える
0

別のシナリオは注文です。新しい注文 (新しい状態) はキャンセルまたは変更できますが、返金はできません。ただし、完成した状態になるとキャンセルはできませんが、返金される場合があります。

于 2012-04-20T20:14:23.143 に答える