Формализованное описание элементов системы и взаимодействия между ними

Формализация превращает слова «компоненты как-то взаимодействуют» в модель, которую можно проверить.

Структуру удобно представить ориентированным графом:

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

Пример

flowchart LR
    A["API"] -->|"команда, sync"| B["Обработчик"]
    B -->|"событие, async"| C["Брокер"]
    C --> D["Проекция"]

Одной стрелки мало. Для каждой границы фиксирую:

  • кто инициатор и кто владелец контракта;
  • что передаётся;
  • возможны ли повторы и изменение порядка;
  • какой таймаут;
  • как обнаруживается ошибка;
  • кто выполняет retry;
  • как меняется состояние.

Уровни формализации

  1. Контекст: система и внешние участники.
  2. Структура: компоненты и связи.
  3. Контракт: схемы входов и выходов.
  4. Поведение: состояния, события и переходы.
  5. Количественная модель: интенсивности, задержки, вероятности.

Выбираю минимальный уровень, достаточный для решения. Слишком подробная модель быстро устаревает; слишком общая не позволяет проверить гипотезу.

Связано: Представление системы семантической моделью, Логико-динамическая модель системы.

Самопроверка

  • Какие атрибуты связи нужны для анализа повторной доставки?
  • Когда граф компонентов недостаточен?
  • Как понять, что модель избыточно подробна?