Как на диаграмме последовательности показать зацикленность?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отображение цикличности на диаграммах последовательности (UML Sequence Diagram)
Диаграммы последовательности (Sequence Diagram) — это мощный инструмент для моделирования поведения системы. Рассмотрю различные способы показать циклические процессы.
Основной механизм: Fragment (Фрагмент)
В UML используются специальные фрагменты (interaction fragments) для представления управляющих структур. Для циклов используется фрагмент loop.
Синтаксис loop фрагмента
loop [condition]
// содержимое цикла
end
Пример 1: Простой цикл обработки очереди
sequenceDiagram
participant Consumer
participant Queue
participant Processor
Consumer->>Queue: subscribe()
loop While messages exist
Queue->>Processor: getMessage()
activate Processor
Processor->>Processor: process(message)
Processor-->>Queue: ACK
deactivate Processor
end
Описание:
loopфрагмент обозначает повторяющиеся действия- Условие указывается в скобках:
While messages exist - Все действия внутри фрагмента выполняются циклически
activate/deactivateпоказывают период активности объекта
Пример 2: Цикл с условием выхода
sequenceDiagram
participant Client
participant Retry Service
participant Server
Client->>Retry Service: send(request)
loop Retry up to 3 times OR response received
Retry Service->>Server: HTTP GET /api/data
alt Server responds (200-299)
Server-->>Retry Service: response OK
else Server returns 5xx (Server error)
Retry Service->>Retry Service: wait(exponential_backoff)
else Max retries exceeded
Retry Service-->>Client: error (Max retries)
end
end
Retry Service-->>Client: final response
Ключевые элементы:
- loop — цикл с условием продолжения
- alt — альтернативные пути (if-else)
- Условие выхода указано в заголовке loop
Пример 3: Вложенные циклы
sequenceDiagram
participant DataLoader
participant Database
participant Cache
DataLoader->>Database: getAll(records)
loop For each record
Database-->>DataLoader: record
loop Process batches of 100 items
DataLoader->>Cache: set(key, value)
Cache-->>DataLoader: OK
end
DataLoader->>DataLoader: log(progress)
end
DataLoader-->>DataLoader: notify(completed)
Особенности вложенных циклов:
- Внешний loop — по записям
- Внутренний loop — по батчам
- Каждый loop имеет свое условие
Пример 4: Цикл с параллельными действиями
sequenceDiagram
participant Orchestrator
participant Worker1
participant Worker2
participant Worker3
Orchestrator->>Orchestrator: tasks = getQueue()
loop While tasks not empty
par Parallel processing
Orchestrator->>Worker1: process(task1)
Orchestrator->>Worker2: process(task2)
Orchestrator->>Worker3: process(task3)
and
Worker1->>Worker1: do work
Worker2->>Worker2: do work
Worker3->>Worker3: do work
end
Orchestrator->>Orchestrator: wait(all workers)
end
Параллелизм в цикле:
- par — параллельные действия
- Все операции в блоке выполняются одновременно
- and разделяет части параллельного выполнения
Пример 5: Цикл с break (выход из цикла)
sequenceDiagram
participant Reader
participant File
participant Parser
loop Reading file lines
Reader->>File: readLine()
File-->>Reader: line
break When line is EOF
Reader->>Reader: log("End of file")
end
Reader->>Parser: parse(line)
Parser-->>Reader: parsed_data
end
Reader-->>Reader: notify(completed)
Выход из цикла:
- break — условие для прерывания цикла
- Выполняется операция внутри break
- Цикл завершается после break
Пример 6: Практический case — поллинг статуса
sequenceDiagram
participant Client
participant API
participant Database
participant Queue
Client->>API: startJob(data)
API->>Database: saveJob(PENDING)
API->>Queue: enqueue(job)
API-->>Client: job_id, status: PENDING
loop Poll status (max 60 times, every 1s)
Client->>API: getStatus(job_id)
API->>Database: queryJob(job_id)
Database-->>API: job_record
alt Job is COMPLETED
API-->>Client: status: COMPLETED, result
else Job is PROCESSING
API-->>Client: status: PROCESSING, progress
else Job is FAILED
API-->>Client: status: FAILED, error
end
end
Пример 7: Экспоненциальная задержка в цикле
sequenceDiagram
participant Service
participant ExternalAPI
loop Exponential backoff retry
Service->>ExternalAPI: call()
alt Success
ExternalAPI-->>Service: data
else Timeout/Error
Service->>Service: sleep(2^attempt seconds)
Note over Service: Exponential backoff:<br/>1s, 2s, 4s, 8s, 16s...
end
end
Best Practices для отображения циклов
1. Четкое условие цикла
✅ loop While messages exist and timeout not reached
❌ loop process data
2. Понятные имена и условия
✅ loop Retry up to 3 times with backoff
❌ loop X < 3
3. Использование alt для условных выходов
- Комбинируйте
loopиaltдля сложной логики - Четко обозначайте условия продолжения и выхода
4. Документирование времени выполнения
Note over Service: Each iteration: 100ms<br/>Max iterations: 60<br/>Total timeout: 6 seconds
5. Не переусложняйте диаграмму
- Если цикл имеет много операций, рассмотрите разбиение на подсценарии
- Используйте
refдля вызова других диаграмм
Инструменты для рисования диаграмм
Mermaid (популярный выбор)
mermaid
sequenceDiagram
loop retry=1 to 3
Sender->>Receiver: Hello
Receiver-->>Sender: OK
end
PlantUML
@startuml
loop process queue
Consumer -> Queue: get message
Queue --> Consumer: message
end
@enduml
Draw.io, Lucidchart, Visio
- Графический интерфейс
- Поддержка UML Sequence Diagram
- Фрагменты и loop находятся в палитре объектов
Типичные ошибки
Ошибка 1: Неясное условие цикла
❌ loop processing
✅ loop While queue has messages or timeout < 30s
Ошибка 2: Забывают про условие выхода
❌ loop forever (бесконечный цикл не показан)
✅ loop Until manual stop or error limit reached
Ошибка 3: Смешивание цикла и параллелизма без ясности
- Четко разделяйте
loopиparблоки - Комментируйте сложные взаимодействия
Вывод
Для показа циклических процессов на диаграммах последовательности используются:
- loop fragment — основной механизм
- break — для условного выхода
- alt — для выбора пути
- par — для параллельных действий в цикле
Четкое обозначение условий и понятная структура делают диаграмму читаемой и полезной для всех участников проекта.