Перейти к диаграмме последовательности? - PullRequest
0 голосов
/ 06 февраля 2019

Как показать операторы goto на диаграммах последовательности.

Например, на приведенной ниже диаграмме, когда истек срок ожидания до ожидания, я хочу вернуть управление оператору is_item_inventory_onhold_state (item_id),Как я могу показать, что это диаграмма?

enter image description here

Я использую https://sequencediagram.org/ для создания этих диаграмм.

Код, написанный для генерации диаграммы выше:

title Item Executor

loop  for each item in a list 
Client->ItemExecutor: execute(item)

ItemExecutor -> ItemStateService:is_item_inventory_onhold_state(item_id)

alt True - Item state is on hold
ItemStateService -->ItemExecutor: True
ItemExecutor ->ItemExecutor: sleep till hold period 

goto  ItemExecutor -> ItemStateService:is_item_inventory_onhold_state(item_id)

else False - Item is not in Held State
ItemStateService -->ItemExecutor:False
ItemExecutor ->ItemExecutor: do_something()

end

ItemExecutor ->Client : Acknowledge
end 

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Вам не нужно 'goto', так как мы давно не используем их в языке

Добавьте второй цикл и выйдите с объединенным фрагментом 'break'

0 голосов
/ 10 февраля 2019

Goto не поддерживается в диаграммах последовательности (по уважительным причинам).Вместо этого используйте комбинацию операторов loop и break.См. Эту схему: enter image description here sequencediagram.org / Item Executor

sequencediagram.org / Item Executor (со спецификациями исполнения)

Некоторые замечания на этой диаграмме

  • break-fragment оставляет непосредственно включающий фрагмент.Поэтому он должен содержаться непосредственно в loop-fragment.Если он находится внутри alt-фрагмента, остается только этот фрагмент.
  • Оба фрагмента alt и opt не используют guard.Получившийся фрагмент выбирается по появлению сообщения reply с определенным значением return-value.Если вы хотите использовать защиту, вы должны присвоить возвращаемое значение локальной переменной.Это может произойти над альт-фрагментом (см. Диаграмму ниже).
  • возвращаемые значения отображаются с предшествующим двоеточием.Имя сообщения должно предшествовать этому, но когда оно очевидно, оно может быть опущено (как здесь).
  • execution specifications (иногда называемые «активациями») отображаются только там, где они помогают читабельности,Вопреки распространенному мнению, они не являются обязательными.
  • UML не знает для каждого цикла.Поэтому я добавил операции итератора.Термин «для каждого элемента в списке» не является условием guard.Если вы хотите избежать написания итератора, вы можете использовать - semantic free - comment, прикрепленный к циклу.Неправильно использовать логическую защиту для этого смысла.Если вы хотите формальное определение, вы должны добавить свой собственный стереотип «for each loop»
  • Я предполагаю ItemExecutor и ItemStateService - имена классов.Им нужен предшествующий двоеточие, чтобы отличить их от ролевых имен.Конечно, если имена ролей и классов идентичны, ваша диаграмма может быть правильной.
  • Сообщение «Подтверждение» - это просто сообщение reply для сообщения execute.Как таковое оно будет иметь то же имя (которое здесь опущено).
  • В версии со Спецификациями выполнения инструмент рисования не позволял концу execution specifications совпадать с send events вreply-messages, что было бы правильно.

Пример с защитой для фрагментов alt и break (отрывок): with guards секвенированная диаграмма.org / Item Executor (со спецификациями исполнения и охраной)

0 голосов
/ 06 февраля 2019

Само Goto не отображается.Вы просто показываете, какие операции отправляются.Вы можете добавить заметку в том месте, где происходит переход.Тем не менее, я думаю, что использование gotos никоим образом не должно поощряться.Вместо этого он, вероятно, должен обрабатывать некоторые исключения.

Согласно вашим комментариям вы можете использовать такой фрагмент break:

enter image description here

Это нарушит внешний цикл, поэтому is_item... повторяется после sleep....

Примечание Согласно комментарию @AxelScheithauer, break просто оставит включающий фрагмент.Однако я бы посчитал это недостатком спецификации.Разрыв «обычно» используется с потоками управления циклом (плюс поток управления регистром; но в UML для этого нет фрагмента).Вероятно, лучше всего назвать фрагмент break, поэтому ясно, что он повлияет на фрагмент внешнего цикла (как показано на моем отредактированном изображении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...