Система отслеживания состояния в Vest строится вокруг идеи декларативного описания правил и последующего детерминированного вычисления результата валидации. В отличие от императивных подходов, где ошибки накапливаются вручную, здесь состояние является производным от выполнения набора тестов, сгруппированных в единый валидационный набор.
Ключевая особенность заключается в том, что состояние не хранится как изменяемая сущность «внутри» правил — оно вычисляется при каждом запуске проверки и представляет собой структурированный снимок результата.
Результирующее состояние после выполнения валидационного набора включает несколько уровней:
На верхнем уровне формируется агрегированное представление:
Это позволяет быстро определить итог без обхода всех полей.
Каждое поле получает собственный сегмент состояния:
Такой подход позволяет рассматривать форму как дерево состояний, где каждый узел автономен, но связан с общим результатом.
В Vest состояние формируется не через мутацию, а через последовательное выполнение тестов, которые описывают условия проверки.
Каждый тест:
Важно, что тесты не изменяют глобальное состояние напрямую. Вместо этого они влияют на контекст выполнения, который затем агрегируется в финальный результат.
Контекст выступает промежуточным слоем между тестами и итоговым состоянием.
Он отвечает за:
Контекст изолирует логику тестирования от финальной структуры результата, что делает систему предсказуемой.
Одним из фундаментальных решений в архитектуре является отсутствие прямой мутации итогового состояния.
Каждый запуск валидации:
Это даёт несколько преимуществ:
Хотя состояние пересоздаётся полностью, система эффективно отслеживает изменения входных данных.
Механизм сравнения входов позволяет:
Отслеживание изменений обычно опирается на сравнение значений полей между текущим и предыдущим запуском.
Тесты в Vest объединяются в группы. Каждая группа имеет собственное поддерево состояния.
Группы позволяют:
Состояние группы агрегируется из состояния входящих тестов и влияет на общий результат только через итоговую сводку.
Не все части состояния вычисляются одновременно. Система поддерживает условное выполнение тестов, что влияет на структуру итогового результата.
Условная логика позволяет:
В результате состояние может быть «неполным» до тех пор, пока не выполнены все релевантные условия.
Одним из ключевых аспектов является реактивная зависимость между полями.
Если одно поле влияет на другое, изменение первого приводит к пересчёту состояния зависимого поля.
Типичные сценарии:
Система отслеживает такие зависимости через контекст и пересчитывает только затронутые узлы.
Ошибки не являются побочным эффектом — они представляют основную часть состояния.
Каждая ошибка включает:
Это делает состояние самодостаточным и пригодным для UI-отображения без дополнительной обработки.
Во время выполнения набора тестов формируется промежуточное состояние:
Это состояние существует только в рамках одного запуска и не сохраняется после завершения.
Финальное состояние формы — это результат объединения всех подуровней:
Агрегация выполняется детерминированно, что позволяет одинаковым входным данным всегда давать идентичный результат.
Для повышения производительности система использует несколько стратегий:
Эти подходы позволяют масштабировать валидацию на большие формы без линейного роста затрат.
Хотя состояние не зависит от конкретного интерфейса, его структура оптимизирована для UI-слоя.
Обычно используется:
Таким образом, состояние выступает единственным источником истины для интерфейса.
Повторные запуски валидации всегда приводят к полной пересборке состояния, что исключает:
Это особенно важно при сложных формах с множественными зависимостями, где инкрементальные изменения могли бы привести к рассинхронизации.
Система строится на строгом принципе:
одни и те же входные данные → одно и то же состояние
Это достигается за счёт:
Такой подход делает поведение валидации полностью воспроизводимым.