Что такое диаграмма последовательности (Sequence Diagram)? Какие элементы она содержит?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Диаграмма последовательности (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 при создании диаграмм последовательности
-
Избегай перегромождения
- Одна диаграмма = один сценарий
- Если много условий → несколько диаграмм
- Максимум 6-7 объектов на диаграмме
-
Будь ясен с левым направлением
- Слева направо: временная последовательность
- Сверху вниз: ход времени
- Не пересекай стрелки (если можно)
-
Используй осмысленные имена
- methodName() для методов
- Описательные названия вместо m1(), m2()
- Указывай параметры
-
Включай коды возврата и данные
├────────────────→ getData(id=123) │ ←────────────── user:User -
Четко обозначай альтернативные потоки
- alt для условной логики
- break для исключений
- opt для опциональных взаимодействий
-
Документируй время и временные ограничения
├────────────────→ query() {timeout: 5s} -
Покажи отказоустойчивость
- Обработка ошибок
- 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 (проблем с параллелизмом)
- Анализ потоков данных
Диаграмма последовательности — это мощный инструмент для общения между аналитиками, архитекторами и разработчиками. Она помогает выявить проблемы на этапе проектирования, а не разработки.