Формализованное описание элементов системы и взаимодействия между ними
Формализация превращает слова «компоненты как-то взаимодействуют» в модель, которую можно проверить.
Структуру удобно представить ориентированным графом:
— элементы, — направленные связи. Для каждой связи полезно добавить тип, данные, кратность, синхронность и ограничения:
Пример
flowchart LR A["API"] -->|"команда, sync"| B["Обработчик"] B -->|"событие, async"| C["Брокер"] C --> D["Проекция"]
Одной стрелки мало. Для каждой границы фиксирую:
- кто инициатор и кто владелец контракта;
- что передаётся;
- возможны ли повторы и изменение порядка;
- какой таймаут;
- как обнаруживается ошибка;
- кто выполняет retry;
- как меняется состояние.
Уровни формализации
- Контекст: система и внешние участники.
- Структура: компоненты и связи.
- Контракт: схемы входов и выходов.
- Поведение: состояния, события и переходы.
- Количественная модель: интенсивности, задержки, вероятности.
Выбираю минимальный уровень, достаточный для решения. Слишком подробная модель быстро устаревает; слишком общая не позволяет проверить гипотезу.
Связано: Представление системы семантической моделью, Логико-динамическая модель системы.
Самопроверка
- Какие атрибуты связи нужны для анализа повторной доставки?
- Когда граф компонентов недостаточен?
- Как понять, что модель избыточно подробна?