Skip to content

🧩 Руководство по проектированию паттернов ​

В этом разделе показано, как проектировать собственные DSL-паттерны.
Здесь не только чтение, но и понимание того, как строить их осознанно и правильно.

🧠 Начать с требований ​

Перед тем как писать паттерн, нужно определить:

  • Какие входные данные допустимы?
  • Какие входные данные должны отклоняться?

Пример ​

Если нужно минимум один color-stop

Тогда правило будет:

ts
^[color-stop,~color-stop].

📌 Строить по шагам ​

Не стоит сразу писать сложные паттерны.

Начать с простого:

ts
^color-stop.

Затем расширить:

ts
^[color-stop,color-stop].

И только потом:

ts
^[color-stop,~color-stop].

📌 Последовательности задают порядок ​

Если порядок важен, используется [].

bash
[config,color-stop]

Означает:

bash
config → затем color-stop

📌 Группы задают альтернативы ​

Если возможны разные структуры:

bash
(config|color-stop)

Комбинация с последовательностью ​

bash
([config,color-stop]|color-stop)

Читается так:

bash
либо:
  config → color-stop
либо:
  color-stop

📌 Повторение требует аккуратности ​

bash
~color-stop

Означает:

bash
0..n color-stop

Важно ​

Повторение всегда должно находиться внутри последовательности:

ts
^[color-stop,~color-stop] ✅

Не так:

ts
^color-stop~color-stop ❌

⚠️ Избегать неявного поведения ​

DSL ничего не предполагает.

Всё должно быть задано явно.

Плохо ​

ts
^(config|color-stop)~color-stop

Хорошо ​

ts
^[(config|color-stop),~color-stop].

📌 Строгие и гибкие паттерны ​

Гибкий паттерн ​

ts
^[([config,color-stop]|color-stop),~color-stop].

Допускает:

bash
config, color-stop

Строгий паттерн ​

ts
^[([config,color-stop,([color-hint,color-stop]|color-stop)]|color-stop),~([color-hint,color-stop]|color-stop)].

Исключает некорректные градиенты.

🧠 Когда использовать строгий подход ​

Используется, когда:

  • результат должен быть валиден для рендера
  • нужно исключить неоднозначные состояния
  • корректность важнее гибкости

🧠 Когда использовать гибкий подход ​

Используется, когда:

  • строится редактор
  • допускается частичный ввод
  • ввод происходит постепенно

🔁 Думать в терминах потока ​

Вместо:

bash
как выглядит паттерн?

Лучше думать:

bash
как входные данные проходят через этот паттерн?

Пример ​

ts
^[color-stop,~([color-hint,color-stop]|color-stop)].

Поток:

bash
начало → color-stop → повтор:
  либо hint → stop
  либо stop
→ конец

🧩 Шаблоны паттернов ​

1. Минимум один элемент ​

ts
^[item,~item].

2. Опциональный config + элементы ​

ts
^[([config,item]|item),~item].

3. Элементы с hint ​

ts
^[item,~([hint,item]|item)].

4. Фиксированная структура ​

ts
^[config,item,item].

❌ Частые ошибки ​

Отсутствие последовательности ​

ts
(config|item)~item ❌

Неправильное использование OR ​

ts
[item|item] ❌

Правильно:

ts
(item|item)

Допуск некорректного окончания ​

bash
item, hint ❌

Правильно:

ts
[item,~([hint,item]|item)]

🧠 Чеклист ​

Перед финализацией паттерна:

  • есть ли ^ и .?
  • все ли последовательности заданы через []?
  • все ли альтернативы обёрнуты в ()?
  • корректно ли используется ~?
  • исключены ли невалидные состояния?

🚀 Итог ​

Проектирование DSL-паттернов — это:

  • ясность
  • явная структура
  • предсказуемое поведение

Сначала простая форма, затем уточнение.

🔗 Попробовать ​

Можно спроектировать свой паттерн и проверить его:

👉 Открыть DSL Playground →