Basit durum makinesi örnek C#?
Güncelleme:
Örnekler için teşekkürler, çok yararlı ve kastetmiyorum aşağıdaki ile olmuştur yine her şeyi onlardan almak için.
Şu anda verilen örnekler kadar onları anlıyorum ve makineler de devlet değil, biz genellikle devlet-makine tarafından anlamak ne sadece yarısı?
Öyle örnekler değiştirecek devlet ama tek temsil değişen bir değişkenin değerinin (ve sağlayan, farklı değer değişiklikleri farklı Birleşik Devletleri), ise genellikle bir devlet makinesi de değişiklik davranış ve davranış değil (sadece) duygusu sağlayan, farklı değer değişiklikleri için bir değişkene bağlı olarak devlet, ama bu anlamda izin veren farklı yöntemler çalıştırılacak farklı Birleşik Devletleri.
Ya durum makineleri ve bunların ortak kullanım bir yanlış kanı var mı?
Saygılarımla
Orijinal soru:
Buldum bu tartışma hakkında state machines & iterator blocks in c# ve araçlar oluşturmak için durum makineleri ve ne değildir, C# için, bu yüzden buldum çok soyut şeyler ama bir çaylak olarak, tüm bu biraz kafa karıştırıcı.
Eğer birisi bir C sağlayabilir olursa çok iyi olur# belki de kaynak 3,4 Birleşik Devletleri ile basit devlet bir makine, sadece özü almak fark bu kod örneği.
CEVAP
Hadi bu basit durum diyagramı ile başlar:
Var:
- 4 Birleşik Devletleri (),, Duraklatıldı, Etkin ve Etkin olmayan Çıkıldı
- Devlet geçişler 5 tip (Komutunu, Son Komutu, Duraklat Komutu, Komut Özgeçmiş, Exit Komutu Başlar).
Bunu C dönüştürebilirsiniz# mevcut durumu ve komut için bir anahtar deyimini gerçekleştirmek gibi yollar bir avuç, ya da bir geçiş tablo geçişler arıyorsunuz. Bu basit durum makinesi için kullanma Dictionary
: Bir temsil için çok kolay bir geçiş tablo, tercih ederim
using System;
using System.Collections.Generic;
namespace Juliet
{
public enum ProcessState
{
Inactive,
Active,
Paused,
Terminated
}
public enum Command
{
Begin,
End,
Pause,
Resume,
Exit
}
public class Process
{
class StateTransition
{
readonly ProcessState CurrentState;
readonly Command Command;
public StateTransition(ProcessState currentState, Command command)
{
CurrentState = currentState;
Command = command;
}
public override int GetHashCode()
{
return 17 31 * CurrentState.GetHashCode() 31 * Command.GetHashCode();
}
public override bool Equals(object obj)
{
StateTransition other = obj as StateTransition;
return other != null && this.CurrentState == other.CurrentState && this.Command == other.Command;
}
}
Dictionary<StateTransition, ProcessState> transitions;
public ProcessState CurrentState { get; private set; }
public Process()
{
CurrentState = ProcessState.Inactive;
transitions = new Dictionary<StateTransition, ProcessState>
{
{ new StateTransition(ProcessState.Inactive, Command.Exit), ProcessState.Terminated },
{ new StateTransition(ProcessState.Inactive, Command.Begin), ProcessState.Active },
{ new StateTransition(ProcessState.Active, Command.End), ProcessState.Inactive },
{ new StateTransition(ProcessState.Active, Command.Pause), ProcessState.Paused },
{ new StateTransition(ProcessState.Paused, Command.End), ProcessState.Inactive },
{ new StateTransition(ProcessState.Paused, Command.Resume), ProcessState.Active }
};
}
public ProcessState GetNext(Command command)
{
StateTransition transition = new StateTransition(CurrentState, command);
ProcessState nextState;
if (!transitions.TryGetValue(transition, out nextState))
throw new Exception("Invalid transition: " CurrentState " -> " command);
return nextState;
}
public ProcessState MoveNext(Command command)
{
CurrentState = GetNext(command);
return CurrentState;
}
}
public class Program
{
static void Main(string[] args)
{
Process p = new Process();
Console.WriteLine("Current State = " p.CurrentState);
Console.WriteLine("Command.Begin: Current State = " p.MoveNext(Command.Begin));
Console.WriteLine("Command.Pause: Current State = " p.MoveNext(Command.Pause));
Console.WriteLine("Command.End: Current State = " p.MoveNext(Command.End));
Console.WriteLine("Command.Exit: Current State = " p.MoveNext(Command.Exit));
Console.ReadLine();
}
}
}
Biraz kişisel bir tercih, ben gibi tasarım benim durum makineleri ile GetNext
işlevin sonraki devlet deterministically MoveNext
işlevi için mutasyona devlet makinesi.
Birisi kosinüs benzerliği bir örnek, ç...
İçinde döngüler JavaScript kapatma – b...
antlr: basit bir örnek var mı?...
Basit bir örnek'JSFiddle üzerinde...
Android özel tost : basit bir örnek...