# Нотация UML (SD)

**UML (Unified Modeling Language)** – унифицированный язык моделирования системных и бизнес-процессов.

**SD (Sequence Diagram)** – диаграмма последовательностей. Визуализирует взаимодействие между объектами в системе, показывает порядок сообщений, которыми объекты обмениваются во времени, и их жизненный цикл.

**Диаграмма последовательностей состоит из следующих элементов:**

* **объекты** (зеленое);
* **линии жизни** (красное);
* **сообщения** (синее).

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FFJBF445XazSaNbCKPrjU%2Fimage.png?alt=media&#x26;token=be19cab5-6ec4-4f74-a94b-039a741bcc86" alt="" width="563"><figcaption></figcaption></figure></div>

### **Объекты**

Сущности, которые взаимодействуют друг с другом. Основные типы объектов:

* **actor** – пользователь или «клиент»;
* **participant** – сервер, компонент системы;
* **database** – база данных;
* **queue** – топик или очередь.

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FoxZjKZ69hhZdoXgskG0h%2Fimage.png?alt=media&#x26;token=1f9354f8-c1b8-487c-8f82-6ff6d22053f9" alt=""><figcaption></figcaption></figure></div>

### **Линии жизни**

Отображают течение времени, а также активность или исполнение определенных функций объекта. Представляют из себя вертикальную линию с блоком активности.

### **Сообщения**

Показывают обмен информацией между объектами. Например, клик пользователя по кнопке, но чаще это запрос или ответ, вызов хранимой процедуры или отправка сообщения. Сообщения отображаются в виде стрелок. Вид стрелки определяет тип сообщения:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FXIq6GJxnmAiETcYeMQNh%2Fimage.png?alt=media&#x26;token=685b4d3c-391b-4eb3-a263-a59c51a6ed26" alt="" width="563"><figcaption></figcaption></figure></div>

### **Инструменты для работы с UML SD**

* графический редактор **draw.io**;
* песочница **plantUML**;
* плагины в инструментах **JetBrains** или **VSCode.**

## Синтаксис PlantUNL

### **Определяем объекты**

```plant-uml
actor "Пользователь" as u
participant "Фронт" as f
participant "Бэк" as b
```

### **Описываем сообщения**

```plant-uml
u -> f
f -> b
b -->> f
f -->> u
```

Основные типы стрелок:

```plant-uml
a ->> b: Асинхронный вызов
a -> b: Синхронный вызов
a -->> b: Ответ
a -x b: Запрос, который будет удален
'или от которого решили отказаться/устаревший
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2Fn0kXp3Lw7AbFjOpvPeUa%2Fimage.png?alt=media&#x26;token=28762fe7-5595-4db4-9b64-cd817398f299" alt="" width="301"><figcaption></figcaption></figure></div>

### **Группируем сообщения**

**Группировка Alt** используется с оператором else для того, чтобы показать альтернативные кейсы взаимодействия. Например, объект отправляет запрос, а второй объект, в зависимости от полученных данных, выполняет разные действия.

```plant-uml
alt case 1
  a -> b
else case 2
  a -> c
end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2F3ALtPB3vgsH8RBJUhOlq%2Fimage.png?alt=media&#x26;token=45264657-0f0a-4a90-a0a1-dfff62df3ce8" alt="" width="563"><figcaption></figcaption></figure></div>

**Группировка Opt** используется для того, чтобы выделить сообщение в опциональный кейс. Например, объект отправляет запрос, а второй объект, в зависимости от полученных данных, может выполнить дополнительное действие.

```plant-uml
opt
  a -> c
end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2F3GmMU1FEw0RHnoMX9WDR%2Fimage.png?alt=media&#x26;token=b7d4d461-a159-43c2-bf11-ec7f5c8af1d4" alt="" width="563"><figcaption></figcaption></figure></div>

**Группировка Par** используется с оператором else для того, чтобы выделить сообщения, которые выполняются параллельно. Например, объект отправляет запрос, а второй объект параллельно выполнит внутренние вычисления и вернёт ответ первому объекту.

```plant-uml
par
  a -> b
else
  a -> c
end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FZWkKWTiVrZNCqGk4s7r5%2Fimage.png?alt=media&#x26;token=bd3b98a5-c74a-4d82-aa4f-0f8f84dd59c4" alt="" width="563"><figcaption></figcaption></figure></div>

**Группировка Loop** используется для того, чтобы выделить сообщения, которые выполняются несколько раз. Например, объект отправляет запрос, а второй объект выполнит внутренние действия несколько раз в зависимости от отправленных данных.

```plant-uml
loop
  a -> c
end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FPRfuPpusuLNE8Aay2e6U%2Fimage.png?alt=media&#x26;token=d8e913a6-439c-4f2d-9a24-1c130d90796f" alt="" width="563"><figcaption></figcaption></figure></div>

**Группировка Group** используется для того, чтобы скомпоновать сообщения по смыслу. Например, на диаграмме может быть много взаимодействий и для того, чтобы было меньше путаницы можно подписать группы сообщений.

```plant-uml
group
  a -> c
end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FKpahzethEnfunN56Ck54%2Fimage.png?alt=media&#x26;token=60814a39-e807-4d20-a0fe-0bb13e8dad5c" alt="" width="563"><figcaption></figcaption></figure></div>

**Можно группировать сами объекты.** Часто используется для описания взаимодействия нескольких систем с микросервисами.

```plant-uml
box Название
  participant "Название 1"
  participant "Название 2"
box end
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FkPQvuoLkvkUhPoOtxh4t%2Fimage.png?alt=media&#x26;token=71a15cd1-f04f-4d20-a7d5-b73d84fcefac" alt=""><figcaption></figcaption></figure></div>

## Полезные возможности PlantUML

### **Изменить цвет стрелок**

```plant-uml
-[#blue]>
-[#ff00ff]>
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2Fb2ogFiVTFw9x76ksA5qC%2Fimage.png?alt=media&#x26;token=15ce4a62-4975-418f-b261-8b8aee933fca" alt="" width="375"><figcaption></figcaption></figure></div>

### **Изменить цвет текста**

```plant-uml
A -> B: <color #f0f>Запрос</color>
B -->> A: <color #green>Ответ</color>
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FCcLjbxZDGhl8XYqMvL1a%2Fimage.png?alt=media&#x26;token=2782f34b-5189-4007-b666-f13c34f412fb" alt="" width="375"><figcaption></figcaption></figure></div>

### **Добавить подсказку**

```plant-uml
note right
  REST: **some.adress.com:433/new**
end note
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FOaK6fEHgV5ZZXNxLSTUr%2Fimage.png?alt=media&#x26;token=c5a6b93e-89f2-443c-9b03-06858383afbc" alt="" width="563"><figcaption></figcaption></figure></div>

### **Поставить разделительную черту**

```plant-uml
== Сохранение данных ==
```

Визуализация:

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2FGLneeGBwDLNyNV0ilddt%2Fimage.png?alt=media&#x26;token=b14656ec-263f-4ee3-ab7c-eb6e11dedc01" alt="" width="375"><figcaption></figcaption></figure></div>

## Пример разработки SD в PlantUML

<div align="left"><figure><img src="https://956387675-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FczgjL0lfenykQjm6DQfO%2Fuploads%2F28OuNTb3gtkYEyW8fXLL%2Fimage.png?alt=media&#x26;token=f79d97f3-a05e-4c4f-8eea-bf19c0e0a7bb" alt=""><figcaption></figcaption></figure></div>
