Почему Akka.Net не предупреждает, если пользователь пытается перейти в неопределенное состояние в FSM? - PullRequest
0 голосов
/ 18 сентября 2018

Сейчас я изучаю Akka.Net и пытаюсь написать простого актера из ФСМ. Вчера я провел целый день, пытаясь разгадать следующую загадку. Вот упрощенная версия моего кода:

public MyFSMActor()
{
    StartWith(State.A, MyData.Empty);

    When(State.A, e => condition0 ? GoTo(State.B) : Stay());
    When(State.B, e => condition1 ? condition2 ? Goto(State.C) : GoTo(State.D) : Stay());
    When(State.C, e => NotImplementedException());
}

Я проводил модульное тестирование своего класса и проверял, что FSM ведет себя в соответствии со спецификациями, за исключением случаев, когда я пытался проверить случай, когда FSM должен перейти на State.D. Тест всегда не удался, потому что FSM оставался в State.B. Мне потребовалось много времени, чтобы понять, что я не указал, что у FSM был State.D, написав соответствующий

When(State.D, e => Whatever());

Но это действительно озадачило меня, потому что я ожидал, что реализация FSM Akka.Net предупредит меня (выбрасывая исключение или что-то еще), что я пытаюсь перейти в неопределенное состояние. Вместо этого FSM просто остался в текущем состоянии, и я не мог понять, почему.

Итак, мой вопрос: не должен ли Akka.Net предупредить, если пользователь пытается перейти в неопределенное состояние в FSM? Почему этого не делает?

1 Ответ

0 голосов
/ 26 сентября 2018

После небольшого исследования и благодаря моим коллегам по работе я узнал, что возвращение null в любом делегате, указанном для состояний, делает событие обработанным делегатом WhenUnhandled().Но бывает, что возвращение неопределенного состояния (не заданного ни одним вызовом When()) приводит к тому же поведению.

Проблема в том, что у меня не определен делегат WhenUnhandled(), поэтому FSM по умолчанию настроен наосновное поведение в таких случаях: оставаться в том же состоянии и ничего не делать.

...