# Поток событий

В FlowEngine все компоненты интерфейса являются **событийно-ориентированными**. Поведение, взаимодействие и изменения данных компонентов запускаются событиями и выполняются в рамках потока.

## Статический и динамический потоки

В FlowEngine потоки можно разделить на два типа:

### **1. Статический поток**

- Определяется разработчиками в коде;
- Применяется ко **всем экземплярам класса модели**;
- Обычно используется для обработки общей логики класса модели;

### **2. Динамический поток**

- Настраивается пользователями через интерфейс;
- Действует только для конкретного экземпляра;
- Часто используется для персонализированного поведения в конкретных сценариях;

Проще говоря: **статический поток — это логический шаблон, определённый на уровне класса, тогда как динамический поток — это персонализированная логика, определённая на уровне экземпляра.**

## Правила связывания и динамический поток

В системе конфигурации FlowEngine существует два способа реализации логики событий:

### **1. Правила связывания**

- Представляют собой **инкапсуляцию встроенных шагов потока событий**;
- Проще в настройке и более семантичны;
- По сути, это упрощённая форма **потока событий**.

### **2. Динамический поток**

- Обладает полными возможностями настройки потока;
- Позволяет настраивать:
  - **Триггер (on)**: определяет, когда запускать;
  - **Шаги выполнения (steps)**: определяют логику выполнения;
- Подходит для более сложной и гибкой бизнес-логики.

Таким образом, **Правила связывания ≈ Упрощённый поток событий**, и их основные механизмы идентичны.

## Согласованность FlowAction

Как **Правила связывания**, так и **Потоки событий** должны использовать один и тот же набор **FlowAction**. Это означает, что:

- **FlowAction** определяет действия, которые могут быть вызваны потоком;
- Оба используют единую систему действий, а не реализуют две отдельные;
- Это обеспечивает повторное использование логики и единообразное расширение.

## Иерархия концепций

На концептуальном уровне основная абстрактная связь FlowModel выглядит следующим образом:

```bash
FlowModel
 └── FlowDefinition
      ├── FlowEventDefinition
      │     ├── Глобальные события
      │     └── Локальные события
      └── FlowActionDefinition
            ├── Глобальные действия
            └── Локальные действия
```

### Описание иерархии

- **FlowModel**
  Представляет собой сущность модели с настраиваемой и исполняемой логикой потока.

- **FlowDefinition**
  Определяет полный набор логики потока (включая условия запуска и шаги выполнения).

- **FlowEventDefinition**
  Определяет источник запуска потока, включая:
  - **Глобальные события**: например, запуск приложения, завершение загрузки данных;
  - **Локальные события**: например, изменение поля, нажатие кнопки.

- **FlowActionDefinition**
  Определяет действия, которые может выполнять поток, включая:
  - **Глобальные действия**: например, обновление страницы, глобальные уведомления;
  - **Локальные действия**: например, изменение значений полей, переключение состояния компонента.

## Итог

| Концепция | Назначение | Область действия |
|------|------|-----------|
| **Статический поток (Static Flow)** | Логика потока, определённая в коде | Все экземпляры XXModel |
| **Динамический поток (Dynamic Flow)** | Логика потока, определённая в интерфейсе | Отдельный экземпляр FlowModel |
| **FlowEvent** | Определяет триггер (когда запускать) | Глобальный или локальный |
| **FlowAction** | Определяет логику выполнения | Глобальный или локальный |
| **Правило связывания (Linkage Rule)** | Упрощённая инкапсуляция шагов потока событий | На уровне блока, действия |