# イベントフロー

FlowEngineでは、インターフェースのすべてのコンポーネントが**イベント駆動型（Event-driven）**です。コンポーネントの動作、インタラクション、データ変更は、イベントによってトリガーされ、フローを通じて実行されます。

## 静的フローと動的フロー

FlowEngineでは、フローは2つのタイプに分けられます。

### **1. 静的フロー（Static Flow）**

- 開発者がコード内で定義します。
- 特定の**モデルクラスのすべてのインスタンス**に作用します。
- モデルクラスの一般的なロジックを処理するためによく使用されます。

### **2. 動的フロー（Dynamic Flow）**

- ユーザーがインターフェース上で設定します。
- 特定のインスタンスにのみ適用されます。
- 特定のシナリオにおけるパーソナライズされた動作によく使用されます。

要するに、**静的フローはクラスに定義されたロジックテンプレートであり、動的フローはインスタンスに定義されたパーソナライズされたロジックです。**

## 連携ルールと動的フロー

FlowEngineの設定システムには、イベントロジックを実装する方法が2つあります。

### **1. 連携ルール（Linkage Rules）**

- **組み込みのイベントフローステップの抽象化**です。
- 設定がより簡単で、セマンティックな意味合いがより強くなります。
- 本質的には、**イベントフロー（Flow）**の簡略化された形式です。

### **2. 動的フロー（Dynamic Flow）**

- 完全なフロー設定機能を提供します。
- カスタマイズ可能です：
  - **トリガー（on）**：いつトリガーするかを定義します。
  - **実行ステップ（steps）**：実行するロジックを定義します。
- より複雑で柔軟なビジネスロジックに適しています。

したがって、**連携ルールは簡略化されたイベントフロー**であり、両者のコアメカニズムは一貫しています。

## FlowActionの一貫性

**連携ルール**と**イベントフロー**のどちらも、同じ**FlowAction**のセットを使用する必要があります。つまり：

- **FlowAction**は、フローによって呼び出し可能なアクションを定義します。
- 両者は別々に2つのシステムを実装するのではなく、1つのアクションシステムを共有します。
- これにより、ロジックの再利用と一貫した拡張が保証されます。

## 概念階層

概念的に、FlowModelのコアとなる抽象的な関係は以下の通りです。

```bash
FlowModel
 └── FlowDefinition
      ├── FlowEventDefinition
      │     ├── グローバルイベント（Global Events）
      │     └── ローカルイベント（Local Events）
      └── FlowActionDefinition
            ├── グローバルアクション（Global Actions）
            └── ローカルアクション（Local Actions）
```

### 階層の説明

- **FlowModel**
  設定可能で、フローロジックを実行できるモデルエンティティを表します。

- **FlowDefinition**
  トリガー条件と実行ステップを含む、完全なフローロジックのセットを定義します。

- **FlowEventDefinition**
  フローのトリガーソースを定義します。これには以下が含まれます：
  - **グローバルイベント**：アプリケーションの起動、データロードの完了など。
  - **ローカルイベント**：フィールドの変更、ボタンのクリックなど。

- **FlowActionDefinition**
  フローが実行できるアクションを定義します。これには以下が含まれます：
  - **グローバルアクション**：ページの更新、グローバル通知など。
  - **ローカルアクション**：フィールド値の変更、コンポーネントの状態切り替えなど。

## まとめ

| 概念 | 目的 | 適用範囲 |
|------|------|-----------|
| **静的フロー (Static Flow)** | コードで定義されるフローロジック | すべてのXXModelインスタンス |
| **動的フロー (Dynamic Flow)** | インターフェースで定義されるフローロジック | 単一のFlowModelインスタンス |
| **FlowEvent** | トリガー（いつトリガーするか）を定義 | グローバルまたはローカル |
| **FlowAction** | 実行ロジックを定義 | グローバルまたはローカル |
| **連携ルール (Linkage Rule)** | イベントフローステップの簡略化された抽象化 | ブロック、アクションレベル |