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 →