Композиция валидаторов представляет собой способ построения сложной логики проверки данных из набора небольших, изолированных и переиспользуемых функций. Вместо создания монолитных проверок используется принцип функциональной сборки, при котором простые предикаты объединяются в более выразительные и управляемые конструкции.
В основе подхода лежит идея, что каждый валидатор выполняет одну конкретную задачу: проверяет тип, диапазон, формат или соответствие правилам. Композиция позволяет объединять такие проверки в цепочки, деревья и альтернативные ветвления без дублирования кода.
Валидатор обычно представляет собой функцию, принимающую значение и возвращающую результат проверки:
true/falseКомпозиция строится вокруг преобразования набора таких функций в новые функции с более сложной логикой. Важное свойство — отсутствие побочных эффектов и детерминированность.
Функциональный подход позволяет рассматривать валидаторы как строительные блоки, которые можно:
Самая базовая форма композиции — логическое «И». Несколько валидаторов применяются последовательно, и результат считается успешным только если все проверки прошли.
Типовая структура:
Такой подход используется для строгих правил, где все условия обязательны: длина строки, формат, допустимые символы, диапазон чисел.
Пример логики:
Композиция AND часто реализуется через функцию-обёртку, принимающую массив валидаторов и возвращающую новый валидатор.
Композиция «ИЛИ» используется для альтернативных правил. Значение считается валидным, если хотя бы один валидатор из набора проходит проверку.
Особенности:
Типичный пример — поле может быть либо email, либо телефонным номером. В этом случае валидаторы проверяются по очереди, и успех любого из них завершает цепочку.
Пайплайн представляет собой линейную трансформацию и проверку значения. Каждый валидатор получает результат предыдущего.
В отличие от чистой проверки, pipeline может:
Такая композиция полезна при обработке пользовательского ввода, где важно не только проверить, но и нормализовать данные перед проверкой.
Предикатная композиция основана на объединении простых логических функций:
isStringisNumberisEmailisInRangeИз них строятся более сложные конструкции:
Комбинирование может быть реализовано через:
Ключевая идея — разделение ответственности между мелкими проверками.
Фабрика валидаторов — это функция, возвращающая новый валидатор на основе параметров.
Примеры параметров:
Фабрики позволяют создавать параметризованные проверки без дублирования логики.
Преимущества:
Фабрики часто являются основой для построения DSL-подобных схем валидации.
Расширяемость достигается за счёт возможности внедрения пользовательских функций в композицию.
Кастомный валидатор:
Он может быть встроен в любую композиционную структуру:
Это позволяет интегрировать доменные правила без изменения базовой системы валидации.
Некоторые проверки требуют асинхронных операций:
Асинхронная композиция усложняет структуру, так как:
Подходы к композиции:
Promise.allАсинхронные валидаторы особенно важны в формах регистрации и сложных бизнес-логиках.
При композиции нескольких валидаторов возникает задача объединения ошибок в единый результат.
Варианты агрегации:
Агрегация важна для UX, так как позволяет отображать пользователю полную картину проблем, а не только первую ошибку.
При композиции AND часто используется стратегия накопления ошибок, тогда как OR может возвращать ошибки всех альтернатив.
Композиция валидаторов напрямую связана с модульностью кода. Каждый валидатор становится независимым модулем, который можно:
Это снижает связность системы и упрощает сопровождение.
Типичная архитектура:
Декораторы позволяют расширять поведение валидаторов без изменения их внутренней логики.
Примеры обёрток:
Декораторы хорошо сочетаются с композиционной моделью, так как могут применяться на любом уровне цепочки.
Условная композиция позволяет изменять набор валидаторов в зависимости от контекста.
Примеры условий:
В этом случае композиция становится динамической:
Это особенно важно в сложных формах и конфигурационных системах.
В реальных приложениях композиция валидаторов принимает устойчивые формы:
1. Слои проверок
Каждый слой строится из композиции валидаторов.
2. Группировка по полям
3. Переиспользуемые блоки
4. Комбинация синхронных и асинхронных проверок
Такой подход оптимизирует производительность и снижает нагрузку на внешние системы.