У меня есть конечный автомат, который должен поддерживать воспроизведение.У нас есть состояния, которые выполняют действия, и иногда нам нужно генерировать случайные числа.Если программа завершает работу во время выполнения FSM, программе необходимо воспроизвести весь FSM, используя те же случайные числа, что и раньше.
Для базового примера, скажем, у меня было три состояния: A, B и C. FSM вызовет функцию Execute () состояния.В конце функции штат опубликует событие, и FSM определит, к какому состоянию перейти.В состоянии A он вызывает rand ().Если число четное, оно отправит событие для перехода в состояние B, в противном случае состояние C должно быть следующим состоянием.
void StateA::Execute(IEventQueue& rQueue)
{
int num = rand();
if( num % 2 == 0 )
{
rQueue.PostEvent("GoToStateB");
}
else
{
rQueue.PostEvent("GoToStateC");
}
}
Если случайное число равно 69, то оно должно перейти в состояние C. В состоянии C программа может завершиться.Когда программа запускается снова, она должна воспроизвести конечный автомат.Очевидно, что для правильной работы он не может сгенерировать совершенно новое случайное число, для точного воспроизведения необходимо снова использовать 69.
У меня есть интерфейс файлового потока, который я могу использовать для сохранения данных вфайл, но код немного уродлив:
void StateA::Execute(IEventQueue& rQueue, IFileStream& rStream)
{
int num = 0;
// fails if there's no more data to read
bool bSuccess = rStream.ReadInt(num);
if (!bSucess)
{
num = rand();
rStream.WriteInt(num);
}
// same code as before
}
Моя единственная проблема с этим решением состоит в том, что мне все равно, нужно ли сначала проверять поток данных и затем условно записывать в тот же поток.
Я думал о том, чтобы скрыть это так:
void StateA::Execute(IEventQueue& rQueue, IStream& rStream)
{
int num = 0;
num = rand();
rStream & num;
// same code as before
}
Внутри IStream оператор & (вероятно, не лучшее использование перегрузки) фактически попытается прочитать int из потока.Если бы этот поток был пустым, он записал бы его вместо этого.Как и раньше, поведение будет таким: сначала читать до конца потока, а затем начинать добавлять.
Поэтому я предполагаю, что мой вопрос таков: есть ли общая идиома для этого типа воспроизведения, которую я мог бы пропустить?У кого-нибудь есть альтернативные предложения?Я чувствую, что начинаю немного усложнять дизайн.
Спасибо!