Как вы представляете асинхронное действие, которое может изменить состояние программы на диаграмме состояний?

У меня есть действие, которое делает две вещи: во-первых, оно меняет состояние приложения, а во-вторых, вызывает веб-сервис. Когда веб-служба отправит свой ответ, это повлияет на текущее состояние приложения.Пример диаграммы состояний

Допустим, у меня есть вышеуказанная установка. Method1() вызывает веб-сервис и вызывает изменение состояния с A на B. После вызова Method1() до вызова Finish() статус может измениться с B на C, с B на Success и т. д.

Если B изменится на Success, оно также может измениться с Success на C.

Как мне связать состояния Success и Fail, когда состояние можно установить в любой момент после действия Method1()?


person Matt R    schedule 06.11.2013    source источник


Ответы (2)


Я не уверен, что действительно понял всю вашу проблему, но для разработки вашей проблемы я бы использовал события. Переход может запускаться, когда происходит событие, поэтому я бы создал событие «ReceiveResponse» и переход между состоянием B и узлом принятия решения (как показано ниже). Это моделирует тот факт, что если конечный автомат находится в состоянии B и получает ответ, запускается переход, и в зависимости от значения ответа статус B меняется на Success или Fail.

Конечный автомат Modelio

Может быть, вы могли бы немного подробнее описать возможный переход или возможное состояние? Возможно ли, чтобы ваш объект находился в двух состояниях одновременно?

Надеюсь, это поможет,

ЭБР

person Red Beard    schedule 06.11.2013
comment
Приложение может находиться в состоянии B или State2, когда происходит событие ReceiveReponse. Если это происходит, когда приложение находится в состоянии B, возможно, затем состояние изменится на State2. - person Matt R; 07.11.2013
comment
Прежде всего извините за мою ошибку, я загрузил свой предыдущий ответ, чтобы сохранить состояние C вместо State2... - person Red Beard; 07.11.2013
comment
Теперь целью конечного автомата является перечисление всех возможных состояний и переходов вашего объекта. Кажется, что у вас есть только 5 возможных состояний, верно? Не могли бы вы подробно описать возможные переходы между ними и объяснить, когда эти переходы будут срабатывать. Например, мой объект находится в состоянии B, происходит получение ответа, если ответ == false, следующим состоянием будет Fail, если ответ == true, следующим состоянием будет Success. Если текущее состояние равно B, а метод Method2 вызывается, следующим состоянием будет C. Например. Я хотел бы знать, что произойдет, если ваш объект получит ответ, а текущее состояние не B? - person Red Beard; 07.11.2013
comment
Вот сценарий: Текущее состояние B, подпрограмма, проверяющая ответ, получает response == true, статус теперь Success, пользователь вызывает method2, статус теперь C. Вот другой сценарий, который также может произойти: Текущий статус B, проверьте, есть ли у нас ответ (у нас его нет), пользователь звонит Method2() и статус меняется на C, мы, наконец, получаем ответ, и response == true статус теперь Success - person Matt R; 07.11.2013
comment
Я загрузил изображение, чтобы учесть ваш последний комментарий. Но у меня есть некоторые комментарии. 1) Вы уверены, что диаграмма состояний действительно лучший способ изобразить вашу проблему? 2) Может быть, вам есть что рассказать ... Я имею в виду, может быть, у вас есть состояние ожидания ответа, которое (с успехом и неудачей) было бы параллельно состояниям A и B? 3) С моей точки зрения, это некоторая ошибка с вашей первой диаграммой, например. переход между начальным состоянием и состоянием A кажется мне неправильным, вы изобразили, что Method1() , Method2() и т. д. выполняются, а не триггер переходов и т. д. - person Red Beard; 08.11.2013

Я бы рекомендовал использовать диаграмму последовательности.

  1. Диаграммы последовательности допускают асинхронные вызовы методов класса/компонента. (или http-запросы, обрабатываемые чем-то, представленным в виде метода) Это действительно то, что вам нужно. Вы бы сфокусировали диаграмму последовательности на том, что они представляют собой несколько потоков управления для достижения определенного результата.

  2. Диаграммы состояний на самом деле имеют довольно низкий уровень и могут плохо отображаться в этой области. Однако, если необходимо, все ваши методы/взаимодействия должны быть преобразованы в изменения состояния, а НЕ в вызовы. Между состояниями перемещается конечный автомат, а не методы и классы. Таким образом, ваши переходы состояний должны быть «получить сообщение B со значением A». Не то, что вы собираетесь для я подозреваю. Это не помогло бы мне понять вашу систему.

  3. Если вам нужно сделать это, потому что вы делаете MDA/Generative UML, то значительно расширите свой вопрос. Я предполагаю, что это основной вопрос UML, если нет, дайте мне знать, и я могу добавить больше деталей.
person Ted Johnson    schedule 07.11.2013
comment
Ну, во-первых, мои навыки UML определенно ниже среднего, так что, пожалуйста, потерпите меня. Меня попросили показать различные состояния, в которых может находиться приложение, но я застрял, пытаясь понять, как я могу показать, что состояние может измениться в любой момент на Fail, а затем перейти к следующему состоянию в потоке. Например, если я нахожусь в состоянии A, а состояние изменяется на Fail, при продолжении работы в приложении состояние может измениться на B, а затем на C. - person Matt R; 07.11.2013