Группировки в диаграммах последовательности
Коротко, что это?
Группировка нужна для того, чтобы как‑то осмысленно скомпоновать сообщения, а также для того, чтобы наложить определенные правила для отдельно взятых сообщений. Вот все существующие типы группировок в sequence диаграммах:
- alt – альтернативные сценарии, с обязательным выполнением по принципу исключающего ИЛИ;
- opt – опциональные(необязательные) сценарии;
- par – обязательные параллельные сценарии, то есть сценарии с выполнением по принципе И;
- loop – обязательный сценарий с повторным выполнением;
- group – группировка для объединения выборки сообщений например по смыслу;
- break – группировка для сценария с завершением, работает по принципу оператора return в функциях;
- critical – группировка для описания фрагмента, который должен иметь только один поток, выполняющийся в один заход(например, запись в БД в одну и ту же таблицу).
Их я хочу разделить на 2 категории, те группировки, которые я постоянно использую при проектировании диаграмм или хотя бы встречаю, и те, которые я не использую и не встречаю в диаграммах коллег. В своей статье я уже разбирал группировки по отдельности с описанием синтаксиса и демонстрацией визуализии. Поэтому в этот раз я создам шуточный процесс взаимодействия микросервисов с использованием сразу всех группировок:
Пример со всеми группировками
Ну и, конечно же, исходный код, куда без него:
@startuml
actor b as "Browser"
participant w as "Web Request Handler"
participant g as "GPT Service"
participant c as "Calculation Service"
participant u as "User Service"
database db as "User Service DB"
participant f as "Food Service"
participant d as "Drink Service"
autonumber
group Обработка потребностей пользователя
b -> w++: Хочу поужинать
w -> g++: Клиент хочет ужин
g --> w--: Дополнительные вопросы для\nвыявления потребностей
w --> b--: Дополнительные вопросы для\nвыявления потребностей
end
group Формирование идеального результата
b -> w++: Ответы на все дополнительные\nвопросы
break Клиент передумал
w --> b: Завершение работы
end
w ->> g++: Ответы на все дополнительные\nвопросы
g -> g: Формирование точечного\nподбора по запросам
g ->> c--++: Данные для формирования ужина
c -> u++: Запрос данных клиента
u -> db: Запрос данных клиента
db --> u: Данные клиента
|||
opt Если были новые данные = true
critical
u -> db: Внесение новых данных
end
end
u --> c--: Данные клиента
par
c -> f++: Тип еды, каллорийность, данные клиента
f -> f: Подбор предварительных блюд по параметрам
f --> c--: Возможные блюда
c -> d++: Запрос на напиток
alt Алкогольный=true
d --> c: Corona Extra
|||
else Газированный=true
d --> c: Coca-Cola
|||
else Успокаивающий
d --> c--: Чай. Молочный улун
|||
end
end
loop Подсчет БЖУ и каллорий для каждого блюда
c -> c: Обработка блюда
end c ->> w--: Идеальный ужин
w --> b--: Идеальный ужин
end
@enduml
Начать дискуссию