Что может сделать этот dsl легче набирать или читать? - PullRequest
3 голосов
/ 20 октября 2010

Я написал рабочую грамматику для замены dbunit в scala под названием ScalaDBTest. Вся программа работает - на написание ушло всего 2 дня. Я получил много полировки, чтобы сделать.

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

Основной синтаксис выглядит следующим образом. Все довольно просто:

country:
- country_id: 1, name: "Canada"
- country_id: 2, name: "United States"

Это, безусловно, лучше, чем операторы вставки XML или SQL.

Я обсуждал, используя ":" или "=". Первый выглядит лучше, но последний, кажется, автоматически набирает текст.

Существует также концепция, при которой вы можете "маркировать" запись. В некотором смысле приведенный выше синтаксис анонимных записей. Ярлыки будут интересной функцией, поскольку вы можете использовать их различными способами.

country:
    record: Canada -> country_id: 1, name: $label # produces "Canada"
    record: UnitedStates -> country_id: 2, name: $label.uncamel # produces "United States"

Мне не нравится этот синтаксис. Это немного два слова. Использование «-» не выглядит правильным, но если я использую фактическое командное слово, такое как «запись», мне нужно поставить «->», чтобы отделить их, иначе это выглядит очень плохо (это не нужно по техническим причинам).

$ label просто повторяет метку, поэтому вы можете использовать метку как минимум для повторного использования строки. $ label.uncamel добавит пробелы там, где это выглядит как верблюжий кейс.

Идея, стоящая за метками, заключается в том, чтобы предоставить API-интерфейсам доступ к записям без необходимости запоминания идентификаторов. Если вы знаете, что объектом страны, которую вы хотите получить, является «Канада», то вы можете просто передать метку «Канада», и она преобразует его в уникальный идентификатор и вытащит его из базы данных.

Вот пример, где вы можете указать параметры по умолчанию:

province:
? country_id: 1, nice_weather: true
- province_id: 1, name: "British Columbia"
- province_id: 2, name: "Manitoba", nice_weather: false
- province_id: 3, name: "New York", country_id: 2

Здесь вы видели какую-то реальную силу. Все эти 3 записи «провинции» будут иметь 4 столбца. Поскольку 2 провинции из Канады, они автоматически наследуются от значений по умолчанию. В третьем случае мы переопределяем это с Соединенными Штатами для Нью-Йорка. Мы можем смешивать / сочетать по мере необходимости.

На практике это сэкономит много печатной и когнитивной нагрузки, так как на практике мы часто заботимся только о нескольких значениях, а остальные могут быть просто заполнителями, чтобы база данных закрывалась из-за отсутствия обязательных полей и т. Д. на. Это действительно помогает в тестировании полиморфных объектов.

Вот еще один:

article:
? date_create: $now
- article_id: 1, title: "The Fed Sucks"
- article_id: 2, title: null

Этот фрагмент демонстрирует, что вы можете фактически помещать нулевые значения, не выполняя никаких трюков, как в dbUnit. В DbUnit сначала необходимо создать преобразователь, который переводит пользовательскую строку (например, «[NULL]») в фактическое нулевое значение.

На самом деле, мы можем быть намного более выразительными и предлагать различные выражения и функции, помогающие генерировать данные. Например, $ сейчас возвращает правильно отформатированную дату sql сегодняшней даты / времени. Я буду расширять эти функции, чтобы упростить написание тестовых данных.

В любом случае, я ищу помощь, чтобы действительно очистить синтаксис. Я могу сделать любое изменение, и, поскольку оно свежее, я бы хотел, чтобы оно было действительно шикарным с самого начала, а не менять его позже.

Спасибо

Ответы [ 4 ]

1 голос
/ 20 октября 2010

Это похоже на YAML , поэтому я предлагаю вам взглянуть на это. Вот несколько допустимых синтаксисов YAML для того, что у вас есть:

country:
  - country_id: 1
    name: Canada
  - country_id: 2
    name: United States

# country
---
country_id: 1
name: Canada
---
country_id: 2
name: United States
1 голос
/ 20 октября 2010

Я предложу расширить исходный синтаксис для метки следующими способами:

  1. Метка сегмента / группы по имени столбца.
    страна: [ярлык: имя]
    - country_id: 1, название: "Канада"
    - country_id: 2, имя: "Соединенные Штаты"
  2. Сегмент / метка группы по индексу столбца, чтобы минимизировать ввод.
    страна: [ярлык: 2]
    - country_id: 1, название: "Канада"
    - country_id: 2, имя: "Соединенные Штаты"
  3. Single Recod
    Страна:
    - [ярлык: 2] country_id: 1, название: «Канада»
    - [label: name] country_id: 2, name: "United States"

Вы можете исключить метки на основе индекса, если не хотите отслеживать количество столбцов в записи.

Если вы хотите расширить инструмент, вы можете добавить другие атрибуты, такие как параллелизм для групп записей, например, создать 5K строк с 5 потоками будет примерно так:


страна: [ярлык: имя] [параллелизм: 5]
- [ярлык: 2] country_id: 1, название: "Канада"
- [label: name] country_id: 2, name: "United States"

1 голос
/ 20 октября 2010

Хотя, безусловно, важно иметь простой для понимания и краткий формат, но IMHO все еще не оправдывает написание собственной проприетарной информации без поиска стандартизированных альтернатив.Рассматривали ли вы возможность использования легких и более удобочитаемых альтернатив XML, таких как JSON или HAML ?Обратите внимание, что у вас все еще есть преимущества поддержки и стандартизации инструментов, если вы поддерживаете только четко определенный поднабор.

1 голос
/ 20 октября 2010

Я бы посоветовал встроить это в Scala, а не создавать внешний DSL.Помогают следующие функции: классы дел, параметры по умолчанию, методы копирования, сгенерированные компилятором.

...