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

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

2.0 Middle🔥 131 комментариев
#Нотации и диаграммы

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

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

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

Цикл в диаграмме последовательности (Sequence Diagram)

Да, абсолютно можно и нужно! Циклы в диаграммах последовательности (UML Sequence Diagrams) — это стандартный способ моделирования повторяющихся взаимодействий между объектами.

Фрагменты взаимодействия (Interaction Fragments)

В UML 2.0 используются специальные фрагменты взаимодействия (interaction fragments) для моделирования сложной логики:

1. Loop (Цикл)

  • Обозначается ключевым словом loop в прямоугольнике
  • Содержит условие повторения в скобках
  • Примеры условий:
    • loop [while x < 10] — пока x меньше 10
    • loop [for each item in list] — для каждого элемента
    • loop [3 times] — ровно 3 раза
  • Все сообщения внутри фрагмента повторяются

2. Alt (Условный выбор)

  • alt [condition1] / else / else if [condition2]
  • Моделирует if-else логику
  • Наиболее часто используемый фрагмент

3. Opt (Опциональное выполнение)

  • opt [condition] — выполнить, если условие истинно
  • По сути, if без else

4. Par (Параллельное выполнение)

  • par [operand1] / par [operand2]
  • Моделирует параллельные потоки
  • Используется для асинхронных операций

5. Seq (Последовательность)

  • Явно указывает последовательное выполнение
  • Используется редко (по умолчанию всё последовательно)

6. Neg (Отрицание)

  • neg [condition] — неверный сценарий
  • Показывает, что это не должно происходить

7. Break (Разрыв)

  • break [condition] — прерывание операции
  • Если условие верно, выход из текущего фрагмента

8. Ref (Ссылка на другую диаграмму)

  • ref [SequenceDiagramName]
  • Позволяет переиспользовать часто повторяющиеся последовательности

Примеры использования Loop

Пример 1: Обработка списка заказов

Customer -> OrderProcessor: getOrders()
loop [for each order]
  OrderProcessor -> PaymentGateway: processPayment(order)
  PaymentGateway -> OrderProcessor: paymentConfirmed()
  OrderProcessor -> Database: updateOrderStatus(order, PAID)
  Database -> OrderProcessor: success
OrderProcessor -> Customer: ordersProcessed()

Пример 2: Retry с условием

Client -> Server: fetchData()
loop [while retries < 3 AND not success]
  alt [server available]
    Server -> Client: data (success)
  else [server timeout]
    Client -> Client: wait(backoff)
end

Пример 3: Комбинация loop и alt

Client -> API: processItems(items)
loop [for each item]
  alt [item.type == 'premium']
    API -> PremiumService: handle(item)
  else [item.type == 'standard']
    API -> StandardService: handle(item)
  end
end
API -> Client: success

Инструменты для создания диаграмм с loop

1. Draw.io (диаграммы.net)

  • Есть палитра фрагментов взаимодействия
  • Интуитивный интерфейс
  • Позволяет вложенные фрагменты

2. Lucidchart

  • Профессиональный инструмент
  • Поддерживает UML 2.0 стандарт полностью
  • Есть шаблоны

3. StarUML

  • Специализированный UML редактор
  • Мощный, но требует обучения

4. PlantUML (текстовый формат)

@startuml
autonumber
loop [for each item]
  Customer -> OrderService: processItem(item)
  OrderService -> PaymentService: charge(item.price)
  PaymentService -> OrderService: success
  OrderService -> Database: save(item)
end
OrderService -> Customer: complete
@enduml

5. Miro/Whimsical

  • Коллаборативные инструменты
  • Хорошо для командной работы

Best Practices при использовании Loop

1. Читаемость и простота

  • Не создавайте слишком глубокую вложенность (макс. 2-3 уровня)
  • Используйте понятные условия
  • Разбейте сложные циклы на несколько диаграмм

2. Именование переменных

  • Используйте понятные имена: for each order, а не for each x
  • Указывайте границы: while retries < 3
  • Будьте конкретны: loop [3 times] или loop [until timeout]

3. Обработка ошибок

  • Показывайте что происходит при ошибке
  • Используйте alt + neg для исключительных сценариев
  • Демонстрируйте retry логику явно

4. Условия выхода

  • Всегда указывайте условие выхода из цикла
  • Избегайте бесконечных циклов в диаграммах
  • Показывайте timeout'ы и лимиты

5. Альтернативы к Loop

  • Если цикл сложный, рассмотрите Ref для переиспользования
  • Может быть проще создать отдельную диаграмму для loop
  • Используйте комментарии для объяснения логики

Когда НЕ использовать Loop

  • Если цикл выполняется только 1 раз — уберите loop
  • Если логика слишком сложная — разделите на подпроцессы
  • Если количество итераций неизвестно — используйте comment вместо loop
  • Если это просто annotation — используйте note вместо loop

Вложенные фрагменты

Можно комбинировать loop с другими фрагментами:

loop [for each batch]
  par
    API -> Service1: process(batch)
    API -> Service2: process(batch)
  end
  alt [success]
    Service1 -> DB: commit()
  else [failure]
    Service1 -> DB: rollback()
  end
end

Итог

Циклы в диаграммах последовательности не только возможны, но и необходимы для моделирования реальных процессов с повторениями. Используйте loop фрагмент для показа итераций, комбинируйте с alt для условной логики, и всегда указывайте явные условия выхода из цикла. Это делает диаграммы более реалистичными и понятными для команды.

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