Включает ли C # конечные автоматы?

Недавно я прочитал о библиотеке boost::statechart (конечных автоматах), и мне понравилась эта концепция.

Есть ли в C # аналогичный механизм? Или это можно реализовать с помощью определенного шаблона проектирования?


person Maciek    schedule 10.09.2009    source источник


Ответы (8)


Да, в C # есть блоки итераторов, которые являются конечными автоматами, сгенерированными компилятором.

Если вы хотите реализовать собственный конечный автомат, вы можете создавать собственные реализации интерфейсов IEnumerable<T> и IEnumerator<T>.

Оба этих подхода подчеркивают реализацию в платформе .NET шаблона итератора.

person Andrew Hare    schedule 10.09.2009
comment
Итераторы - это далеко не конечные автоматы. Некоторые базовые концепции конечных автоматов - это состояния, переходы, средства защиты переходов, действия и иерархические состояния. Это НЕ явно указано в блоках итератора, поэтому я не согласен с тем, что это реализация FSM. - person Henri; 10.09.2009
comment
Блоки итератора реализованы как конечные автоматы, но это не означает, что они подходят для построения произвольного конечного автомата. Эрик Липперт подчеркивает это здесь: stackoverflow.com/questions/1194853/ - person Gabe Moothart; 10.09.2009
comment
@Gabe - Верно, поэтому я указал на интерфейсы IEnumerable<T> и IEnumerator<T>. - person Andrew Hare; 10.09.2009
comment
Также я не утверждал, что блоки итератора должны использоваться для реализации конечного автомата, просто они являются реализацией конечного автомата, который компилятор генерирует для вас. - person Andrew Hare; 10.09.2009
comment
Тот факт, что итераторы используют автомат, не имеет отношения к рассматриваемому вопросу. ОП хочет создать свой собственный. - person Adam Lassek; 07.12.2009
comment
Одно из самых крутых применений итераторов в качестве FSM, которое я видел, - это использование в качестве асинхронных итераторов для асинхронного программирования, наиболее популярным из которых является AsyncEnumerator Джеффри Рихтера. . Возможно, это злоупотребление языковой конструкцией, но это самый простой способ, который я видел до сих пор, для написания асинхронного кода для линейных рабочих процессов на C #. - person fostandy; 27.06.2010
comment
В C # есть еще более простой конечный автомат: docs .microsoft.com / en-us / dotnet / api / - person ; 25.08.2019

.NET 4 Update 1 теперь поддерживает его в следующем классе: System.Activities.Statements.StateMachine

Вот руководство по его использованию. Вот практическая лабораторная работа.

person Alex    schedule 30.07.2011

Workflow Foundation (.NET 3.0) имеет рабочий процесс конечного автомата. В настоящее время в 4.0 нет того же самого, но вы определенно можете создать рабочий процесс конечного автомата, используя 4.0.

person Community    schedule 10.09.2009
comment
Обновление платформы .NET 4 теперь включает поддержку конечного автомата для WF4. - person ; 09.05.2011

Я поддерживаю проект с открытым исходным кодом, который реализует (среди прочего) универсальный конечный автомат для .NET. Он построен на основе QuickGraph, поэтому вы бесплатно получаете множество алгоритмов анализа графиков.

Дополнительную информацию о проекте см. На этой странице, в частности о "Jolt.Automata: Finite State Machines" для получения дополнительной информации об этой функции.

person Steve Guidi    schedule 07.12.2009

Проверьте Stateless -> http://code.google.com/p/stateless/. Это легкая альтернатива более тяжелому WWF.

Вот пара статей автора инструмента:

Государственные машины в моделях предметной области

Параметризованные триггеры и состояния повторного входа в безгражданство

person J.D.    schedule 06.12.2011

То, что приближается к конечным автоматам, - это рабочие процессы в .NET 3.5, однако рабочие процессы не совсем являются конечными автоматами.

Сила использования конечных автоматов заключается в том, что вы можете создавать их явно в своем коде, что снижает вероятность создания ошибок. Кроме того, конечно, некоторые системы по своей природе являются автоматами, поэтому их естественнее кодировать таким образом.

person Henri    schedule 10.09.2009
comment
FSM означает «Летающий спагетти-монстр». Я думаю, вы ответили не на тот вопрос. - person Gabe Moothart; 11.09.2009
comment
Я почти уверен, что он имел в виду не Летающего спагетти-монстра, а имел в виду конечный автомат. - person Nathan Palmer; 12.09.2009

Windows Workflow Foundation (WF), которая является частью библиотеки базовых классов в версиях 3.0 и 3.5, включает дизайн рабочего процесса с конечным автоматом для управления конечными автоматами для ваших приложений.

Они полностью переписали рабочий процесс для предстоящей версии 4.0, и новые классы WF 4.0 не поддерживают машины состояний изначально, но все классы 3.0 / 3.5 по-прежнему полностью поддерживаются в 4.0.

person Bytemaster    schedule 07.12.2009

Другая альтернатива в этом репо: https://github.com/lingkodsoft/StateBliss использует плавный синтаксис, поддерживает триггеры. .

    public class BasicTests
    {
        [Fact]
        public void Tests()
        {
            // Arrange
            StateMachineManager.Register(new [] { typeof(BasicTests).Assembly }); //Register at bootstrap of your application, i.e. Startup
            var currentState = AuthenticationState.Unauthenticated;
            var nextState = AuthenticationState.Authenticated;
            var data = new Dictionary<string, object>();

            // Act
            var changeInfo = StateMachineManager.Trigger(currentState, nextState, data);

            // Assert
            Assert.True(changeInfo.StateChangedSucceeded);
            Assert.Equal("ChangingHandler1", changeInfo.Data["key1"]);
            Assert.Equal("ChangingHandler2", changeInfo.Data["key2"]);
        }

        //this class gets regitered automatically by calling StateMachineManager.Register
        public class AuthenticationStateDefinition : StateDefinition<AuthenticationState>
        {
            public override void Define(IStateFromBuilder<AuthenticationState> builder)
            {
                builder.From(AuthenticationState.Unauthenticated).To(AuthenticationState.Authenticated)
                    .Changing(this, a => a.ChangingHandler1)
                    .Changed(this, a => a.ChangedHandler1);

                builder.OnEntering(AuthenticationState.Authenticated, this, a => a.OnEnteringHandler1);
                builder.OnEntered(AuthenticationState.Authenticated, this, a => a.OnEnteredHandler1);

                builder.OnExiting(AuthenticationState.Unauthenticated, this, a => a.OnExitingHandler1);
                builder.OnExited(AuthenticationState.Authenticated, this, a => a.OnExitedHandler1);

                builder.OnEditing(AuthenticationState.Authenticated, this, a => a.OnEditingHandler1);
                builder.OnEdited(AuthenticationState.Authenticated, this, a => a.OnEditedHandler1);

                builder.ThrowExceptionWhenDiscontinued = true;
            }

            private void ChangingHandler1(StateChangeGuardInfo<AuthenticationState> changeinfo)
            {
                var data = changeinfo.DataAs<Dictionary<string, object>>();
                data["key1"] = "ChangingHandler1";
            }

            private void OnEnteringHandler1(StateChangeGuardInfo<AuthenticationState> changeinfo)
            {
                // changeinfo.Continue = false; //this will prevent changing the state
            }

            private void OnEditedHandler1(StateChangeInfo<AuthenticationState> changeinfo)
            {                
            }

            private void OnExitedHandler1(StateChangeInfo<AuthenticationState> changeinfo)
            {                
            }

            private void OnEnteredHandler1(StateChangeInfo<AuthenticationState> changeinfo)
            {                
            }

            private void OnEditingHandler1(StateChangeGuardInfo<AuthenticationState> changeinfo)
            {
            }

            private void OnExitingHandler1(StateChangeGuardInfo<AuthenticationState> changeinfo)
            {
            }

            private void ChangedHandler1(StateChangeInfo<AuthenticationState> changeinfo)
            {
            }
        }

        public class AnotherAuthenticationStateDefinition : StateDefinition<AuthenticationState>
        {
            public override void Define(IStateFromBuilder<AuthenticationState> builder)
            {
                builder.From(AuthenticationState.Unauthenticated).To(AuthenticationState.Authenticated)
                    .Changing(this, a => a.ChangingHandler2);

            }

            private void ChangingHandler2(StateChangeGuardInfo<AuthenticationState> changeinfo)
            {
                var data = changeinfo.DataAs<Dictionary<string, object>>();
                data["key2"] = "ChangingHandler2";
            }
        }
    }

    public enum AuthenticationState
    {
        Unauthenticated,
        Authenticated
    }
}

person mcdm    schedule 30.07.2019