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

Что такое диаграмма последовательности (Sequence Diagram)? Какие элементы она содержит?

1.0 Junior🔥 91 комментариев
#Требования и их анализ

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

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

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

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

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

Определение и назначение

Диаграмма последовательности отвечает на вопросы:

  • Какие объекты взаимодействуют в этом процессе?
  • В каком порядке происходит взаимодействие?
  • Какие сообщения они обмениваются?
  • Какие условия влияют на поток выполнения?

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

Хорошие кейсы:

  • Сложные бизнес-процессы с множеством участников
  • Микросервисная архитектура (показывает flow между сервисами)
  • Интеграции между системами
  • Критичные операции (платежи, трансфер денег)
  • Асинхронные процессы
  • Обработка ошибок и исключений

Не так подходит:

  • Простые процессы (достаточно текстового описания)
  • Параллельные вычисления (лучше использовать Activity диаграмму)
  • Статическая структура (для этого есть Class диаграмма)

Основные элементы диаграммы последовательности

1. Актор (Actor) / Объект (Object)

Определение: Участник взаимодействия — может быть пользователем, системой, компонентом, сервисом.

Обозначение:

┌─────────────────┐
│  Пользователь  │
│                 │
└────────┬────────┘
         │
         │ (lifeline — линия жизни)
         │
         ▼

Типы акторов:

Актор (User)        Компонент (System)    Сервис (Microservice)
┌──────────────┐    ┌─────────────────┐    ┌──────────────────┐
│ :User        │    │ :LoginService   │    │ :UserService     │
│              │    │                 │    │                  │
└──────┬───────┘    └────────┬────────┘    └─────────┬────────┘
       │                     │                       │
       │                     │                       │

2. Lifeline (Линия жизни)

Определение: Вертикальная пунктирная линия, которая представляет существование объекта во времени.

Варианты:

Активная lifeline (когда объект обрабатывает запрос):
       │
       ▼
    ┌────┐
    │    │ ← Прямоугольник (activation box)
    │    │
    └────┘
       ▲
       │

Прерывистая lifeline (объект неактивен):
       │
       │ (точки означают инертность)
       │

3. Сообщение (Message)

Определение: Взаимодействие между двумя объектами.

Типы сообщений:

Синхронное сообщение (Synchronous) — стрелка с заполненным треугольником:

Объект A              Объект B
    │                    │
    ├─────────────────→  │  getData() ← вызов метода
    │                    │ (объект A ждет ответа)
    │  ←────────────────┤  ← возврат значения
    │                    │

Асинхронное сообщение (Asynchronous) — стрелка с полой стрелкой:

Объект A              Объект B
    │                    │
    ├─────────────→      │  sendEmail()
    │ (объект A не ждет ответа)
    │                    │

Автосообщение (Self message) — стрелка к себе:

Объект A
    │
    ├──────┐
    │      │ validate()
    │←─────┘
    │

Найденное сообщение (Found message) — отсутствует отправитель:

    │                Объект A
    │                    │
    ├──────────────────→ │  сообщение из неизвестного источника
    │                    │

Потеряное сообщение (Lost message) — отсутствует получатель:

Объект A            │
    │               │
    ├───────────────┤  сообщение в никуда
    │               │

4. Условия (Alt / If)

Определение: Условное ветвление в потоке выполнения.

Обозначение:

Объект A              Объект B
    │                    │
    ├─────────────────→  │ checkBalance()
    │                    │
    alt [balance >= amount]
    ├─────────────────→  │ withdraw(amount)
    │                    │
    else [balance < amount]
    ├─────────────────→  │ showError()
    │                    │
    │ [/end alt]         │
    │                    │

Синтаксис:

  • alt — одна из нескольких веток
  • else — иначе
  • [условие] — boolean выражение

5. Цикл (Loop)

Определение: Повторение последовательности сообщений.

Обозначение:

Объект A              Объект B
    │                    │
    loop [for each item]
    ├─────────────────→  │ process(item)
    │                    │
    │ ←────────────────┤  result
    │ [/end loop]        │
    │                    │

6. Parallelism (Параллелизм)

Определение: Сообщения выполняются параллельно.

Обозначение:

Объект A    Объект B    Объект C
    │           │            │
    par
    ├──────────→ │            │ sendEmail()
    │           │            │
    │           ├───────────→ │ saveToDb()
    │           │            │
    │ [/end par] │            │
    │           │            │

7. Optional (Опциональное взаимодействие)

Определение: Сообщение отправляется при определенном условии.

Обозначение:

Объект A              Объект B
    │                    │
    opt [isPremium]
    ├─────────────────→  │ sendPremiumFeature()
    │ [/end opt]         │
    │                    │

8. Break (Точка разрыва)

Определение: Точка, где выполнение может быть прервано.

Обозначение:

Объект A              Объект B
    │                    │
    ├─────────────────→  │ process()
    │                    │
    break [error occurs]
    ├─────────────────→  │ handleError()
    │                    │

Пример 1: Простой процесс входа

Пользователь    LoginService    UserDatabase
    │                │                │
    ├──────────────→ │ login(email)   │
    │                │                │
    │                ├───────────────→ │ findUserByEmail()
    │                │                │
    │                │ ←───────────────┤ User
    │                │                │
    alt [password correct]
    │                │                │
    │                ├───────────────→ │ updateLastLogin()
    │                │                │
    │ ←──────────────┤ JWT token      │
    │                │                │
    else [password wrong]
    │                │                │
    │ ←──────────────┤ error          │
    │                │ [/end alt]     │
    │                │                │

Пример 2: Микросервисная архитектура

Клиент    API Gateway    OrderService    PaymentService    InventoryService
  │             │              │                │                    │
  ├────────────→ │ createOrder()│                │                    │
  │             │              │                │                    │
  │             ├─────────────→ │ validateOrder()│                    │
  │             │              │                │                    │
  │             ├──────────────────────────────→ │ processPayment()  │
  │             │              │                │                    │
  │             │              │ ←──────────────┤ paymentSuccess     │
  │             │              │                │                    │
  │             │              ├──────────────────────────────────→ │
  │             │              │ updateInventory()                   │
  │             │              │                │    ←──────────────┤ success
  │             │              │                │                    │
  │ ←───────────┤ ←────────────┤ order created  │                    │
  │             │              │                │                    │

Пример 3: Асинхронный процесс

Пользователь    WebApp    Backend    Email Service
    │             │         │              │
    ├────────────→ │ requestEmail()│              │
    │             │         │              │
    │ ←──────────┤ request accepted│              │
    │             │         │              │
    (User может закрыть приложение)
    │             │         │              │
    │             │         ├─────────────→ │ sendEmail(async)
    │             │         │              │
    │             │         │              │ (Email отправляется в фоне)
    │             │         │              │
    │             │         │ ←────────────┤ email sent (webhook)
    │             │         │              │

Best Practices при создании диаграмм последовательности

  1. Избегай перегромождения

    • Одна диаграмма = один сценарий
    • Если много условий → несколько диаграмм
    • Максимум 6-7 объектов на диаграмме
  2. Будь ясен с левым направлением

    • Слева направо: временная последовательность
    • Сверху вниз: ход времени
    • Не пересекай стрелки (если можно)
  3. Используй осмысленные имена

    • methodName() для методов
    • Описательные названия вместо m1(), m2()
    • Указывай параметры
  4. Включай коды возврата и данные

    ├────────────────→ getData(id=123)
    │ ←────────────── user:User
    
  5. Четко обозначай альтернативные потоки

    • alt для условной логики
    • break для исключений
    • opt для опциональных взаимодействий
  6. Документируй время и временные ограничения

    ├────────────────→ query() {timeout: 5s}
    
  7. Покажи отказоустойчивость

    • Обработка ошибок
    • Retry логика
    • Fallback сценарии

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

  • PlantUML — текстовое описание (легко в Git)
  • Draw.io — визуальный редактор
  • Lucidchart — профессиональный инструмент
  • Enterprise Architect — полнофункциональный
  • VS Code Extensions — расширения для редакторов

Пример на PlantUML

@startuml
actor User
participant "Web App" as App
participant "API Server" as API
database Database

User -> App: click Login
App -> API: POST /login
API -> Database: SELECT user WHERE email=?
Database --> API: user data
alt password correct
  API --> App: JWT token
  App -> User: redirect to dashboard
else password wrong
  API --> App: 401 Unauthorized
  App -> User: show error
end
@enduml

Сравнение с Activity диаграммой

Sequence Diagram:

  • Фокус: взаимодействие между объектами
  • Время: слева направо (вверх-вниз)
  • Лучше для: микросервисы, интеграции

Activity Diagram:

  • Фокус: поток выполнения, бизнес-логика
  • Время: сверху вниз
  • Лучше для: алгоритмы, процессы

Когда использовать Sequence Diagram

Идеально подходит для:

  • Документирование критичных бизнес-процессов
  • Обучение команды новым интеграциям
  • Анализ существующей системы
  • Проектирование новых features
  • Документирование API контрактов
  • Обнаружение race conditions (проблем с параллелизмом)
  • Анализ потоков данных

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

Что такое диаграмма последовательности (Sequence Diagram)? Какие элементы она содержит? | PrepBro