← Назад к вопросам

Как на диаграмме последовательности показать зацикленность?

1.3 Junior🔥 171 комментариев
#Нотации и диаграммы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отображение цикличности на диаграммах последовательности (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 блоки
  • Комментируйте сложные взаимодействия

Вывод

Для показа циклических процессов на диаграммах последовательности используются:

  1. loop fragment — основной механизм
  2. break — для условного выхода
  3. alt — для выбора пути
  4. par — для параллельных действий в цикле

Четкое обозначение условий и понятная структура делают диаграмму читаемой и полезной для всех участников проекта.

Как на диаграмме последовательности показать зацикленность? | PrepBro