SORU
7 Mayıs 2011, CUMARTESİ


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
7 Mayıs 2011, CUMARTESİ


Hadi bu basit durum diyagramı ile başlar:

simple state machine diagram

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Dumb Stupid Videos

    Dumb Stupid

    26 Kasım 2013
  • FASHTAG

    FASHTAG

    5 EYLÜL 2012