Здравствуйте, WinMute, Вы писали:
WM>Привет Всем!
WM>У меня возник вопрос по реализации выбора состояния (state) в паттернах final state machine (fsm) или state. В и-нете смог найти только реализации когда переход и выбор слетующего состояния происходил либо в самих состояниях либо схема переходов была линейной (что также не соответствует ситуации). Мне надо реализовать схему переходов в одном класе (контексте) и чтоб класы state не знали о существовании других — с использованием state transition table. Смена состояний должна происходить по некоторому событию.
WM>??? Хотелось бы узнать как можно реализовать таблицу состояний на С#, может как то использовать масивы делегатов. Варианты с использованием reflection и xml думаю слишком муторные для такой задачи. Предложеный вариант реализации stt: http://rsdn.ru/article/alg/Static_Finite_State_Machine.xmlАвтор(ы): Alexander Nikolayenko
Дата: 08.10.2005
Машина с конечным числом состояний (FSM, Finite State Machine, или как принято называть по-русски, конечный автомат, КА) представляет собой одну из наиболее полезных концепций в арсенале разработчика. Существует несколько методик реализации конечных автоматов, но, забегая вперед, хочется сказать, что достойный результат дают только те из них, которые связаны с генерацией кода. Возможности, предоставляемые последней версией стандарта C++ и реализованные в последних версиях компиляторов, позволяют генерировать код во время компиляции основного кода проекта. Это дает возможность избежать использования отдельных утилит или расширений IDE и, оставаясь в рамках единого языка (C++), создавать приемлемые для практического использования реализации КА, которые при этом легко поддерживать и развивать.
не понял
. Возможно у кого есть какие идеи по этому поводу
???
Хмм... вроде бы все достаточно straight forward в реализации... попробую вкратце объяснить.
У Вас есть набор состояний и ни одно из не знает ни о каком другом. Каждое состояние обладает набором переходов. То есть это можно развернуть в следующий набор классов:
// Наше базое состояние
public abstract class State
{
// Набор переходов
// Как наполнить этот набор - это вопрос реализации
// (тут как раз таки и можно воспользоваться XML + Reflection, или просто мануально заполнить,
// если набор состояний и переходов не будет меняться)
private IList<Transition> transitions;
// Обрабатываем входное сообщение.
public State Accept(object message)
{
foreach (Transiotion t in this.transitions)
{
if (t.IsAcceptable(message))
{
// Нашли переход, который считает это сообщение поводом для перехода =)
// Переходим
return t.Transit(message);
}
}
// Состояние не изменилось
return this;
}
}
// Базовый переход
public abstract class Transition
{
// Метод, позволяющий узнать является ли это сообщение поводом для перехода.
public abstract bool IsAcceptable(object message);
// Тут мы и осуществляем собственно переход.
public abstract State Transit(object message);
}
Ваша система должна хранить текущее состояние. И идея крайне проста — состояние ничего не знает о других состояниях. О них знают только переходы.
Это давольно сжатое описание и в целом Вам стоит более подробно ознакомиться со статьями — там ничего сложного

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, WinMute, Вы писали:
WM>Здравствуйте, pt4h, Вы писали:
P>>....................
P>>Это давольно сжатое описание и в целом Вам стоит более подробно ознакомиться со статьями — там ничего сложного
WM>Cупер
, верняк: "все гениальное — просто" .
WM>Very thanks!!!
Можно еще использовать кнопки с оценками

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Привет Всем!
У меня возник вопрос по реализации выбора состояния (state) в паттернах final state machine (fsm) или state. В и-нете смог найти только реализации когда переход и выбор слетующего состояния происходил либо в самих состояниях либо схема переходов была линейной (что также не соответствует ситуации). Мне надо реализовать схему переходов в одном класе (контексте) и чтоб класы state не знали о существовании других — с использованием state transition table. Смена состояний должна происходить по некоторому событию.
??? Хотелось бы узнать как можно реализовать таблицу состояний на С#, может как то использовать масивы делегатов. Варианты с использованием reflection и xml думаю слишком муторные для такой задачи. Предложеный вариант реализации stt:
http://rsdn.ru/article/alg/Static_Finite_State_Machine.xmlАвтор(ы): Alexander Nikolayenko
Дата: 08.10.2005
Машина с конечным числом состояний (FSM, Finite State Machine, или как принято называть по-русски, конечный автомат, КА) представляет собой одну из наиболее полезных концепций в арсенале разработчика. Существует несколько методик реализации конечных автоматов, но, забегая вперед, хочется сказать, что достойный результат дают только те из них, которые связаны с генерацией кода. Возможности, предоставляемые последней версией стандарта C++ и реализованные в последних версиях компиляторов, позволяют генерировать код во время компиляции основного кода проекта. Это дает возможность избежать использования отдельных утилит или расширений IDE и, оставаясь в рамках единого языка (C++), создавать приемлемые для практического использования реализации КА, которые при этом легко поддерживать и развивать.
не понял

. Возможно у кого есть какие идеи по этому поводу

???
"... я забыл что в природе еще что-то есть. ..."
(Шевчук Ю. "ДДТ")
Здравствуйте, pt4h, Вы писали:
P>....................
P>Это давольно сжатое описание и в целом Вам стоит более подробно ознакомиться со статьями — там ничего сложного
Cупер

, верняк: "все гениальное — просто" .
Very thanks!!!
"... я забыл что в природе еще что-то есть. ..."
(Шевчук Ю. "ДДТ")