🧩 Руководство по проектированию паттернов
В этом разделе показано, как проектировать собственные DSL-паттерны.
Здесь не только чтение, но и понимание того, как строить их осознанно и правильно.
🧠 Начать с требований
Перед тем как писать паттерн, нужно определить:
- Какие входные данные допустимы?
- Какие входные данные должны отклоняться?
Пример
Если нужно минимум один color-stop
Тогда правило будет:
^[color-stop,~color-stop].📌 Строить по шагам
Не стоит сразу писать сложные паттерны.
Начать с простого:
^color-stop.Затем расширить:
^[color-stop,color-stop].И только потом:
^[color-stop,~color-stop].📌 Последовательности задают порядок
Если порядок важен, используется [].
[config,color-stop]Означает:
config → затем color-stop📌 Группы задают альтернативы
Если возможны разные структуры:
(config|color-stop)Комбинация с последовательностью
([config,color-stop]|color-stop)Читается так:
либо:
config → color-stop
либо:
color-stop📌 Повторение требует аккуратности
~color-stopОзначает:
0..n color-stopВажно
Повторение всегда должно находиться внутри последовательности:
^[color-stop,~color-stop] ✅Не так:
^color-stop~color-stop ❌⚠️ Избегать неявного поведения
DSL ничего не предполагает.
Всё должно быть задано явно.
Плохо
^(config|color-stop)~color-stopХорошо
^[(config|color-stop),~color-stop].📌 Строгие и гибкие паттерны
Гибкий паттерн
^[([config,color-stop]|color-stop),~color-stop].Допускает:
config, color-stopСтрогий паттерн
^[([config,color-stop,([color-hint,color-stop]|color-stop)]|color-stop),~([color-hint,color-stop]|color-stop)].Исключает некорректные градиенты.
🧠 Когда использовать строгий подход
Используется, когда:
- результат должен быть валиден для рендера
- нужно исключить неоднозначные состояния
- корректность важнее гибкости
🧠 Когда использовать гибкий подход
Используется, когда:
- строится редактор
- допускается частичный ввод
- ввод происходит постепенно
🔁 Думать в терминах потока
Вместо:
как выглядит паттерн?Лучше думать:
как входные данные проходят через этот паттерн?Пример
^[color-stop,~([color-hint,color-stop]|color-stop)].Поток:
начало → color-stop → повтор:
либо hint → stop
либо stop
→ конец🧩 Шаблоны паттернов
1. Минимум один элемент
^[item,~item].2. Опциональный config + элементы
^[([config,item]|item),~item].3. Элементы с hint
^[item,~([hint,item]|item)].4. Фиксированная структура
^[config,item,item].❌ Частые ошибки
Отсутствие последовательности
(config|item)~item ❌Неправильное использование OR
[item|item] ❌Правильно:
(item|item)Допуск некорректного окончания
item, hint ❌Правильно:
[item,~([hint,item]|item)]🧠 Чеклист
Перед финализацией паттерна:
- есть ли
^и.? - все ли последовательности заданы через
[]? - все ли альтернативы обёрнуты в
()? - корректно ли используется
~? - исключены ли невалидные состояния?
🚀 Итог
Проектирование DSL-паттернов — это:
- ясность
- явная структура
- предсказуемое поведение
Сначала простая форма, затем уточнение.
🔗 Попробовать
Можно спроектировать свой паттерн и проверить его: