Синтаксис языка SFig эффективный и понятный (и лучше, чем Spring -Framework XML DSL)?

ADDENDUM EDIT:

Не принял на это ответ не было никакой обратной связи с опытная структура Springразработчики.

Я работал над заменой DSL для использования в файлах Spring -Framework applicationContext.xml(где описываются отношения инициализации и зависимостей bean для загрузки в Spring bean factory).

Моя мотивация заключается в том, что я просто не использую XML для этой цели, и мне не нравится какой-либо из альтернатив, которые были разработаны до сих пор. По разным причинам, в которые я не буду вдаваться, я хочу остаться с декларативным языком, а не с каким-то императивным сценарием, например Groovy.

Итак, я схватил инструмент анализатора ANTLR и разрабатывал новый DSL-код bean factory, который я назвал SFig. Здесь ссылка, которая больше об этом говорит:

SFig ™ - альтернативный язык конфигурации метаданных для Spring -Framework

И вот сайт репозитория исходного кода:

http://code.google.com/p/sfig/

Мне интересно знать, как я это делаю в синтаксисе языка. Как вы думаете, SFig эффективен и понятен? (Меня сейчас особенно беспокоит текстовая строка mulit-line):

properties_include "classpath:application.properties";
org.apache.commons.dbcp.BasicDataSource dataSource {
 @scope = singleton;
 @destroy-method = close;
 driverClassName = "${jdbc.driverClassName}";
 url = "${jdbc.url}";
 username = "${jdbc.username}";
 password = "${jdbc.password}";
 defaultAutoCommit = true;
}
org.springframework.orm.******.SqlMapClientFactoryBean sqlMapClient {
 @scope = singleton;
 @init-method = afterPropertiesSet;
 @factory-method = getObject;
 configLocation = "classpath:sqlmap-config.xml";
 dataSource = $dataSource;
}
/* this string will have Java unescape encoding applied */
STRING str = "\tA test\u0020string with \\ escaped character encodings\r\n";
/* this string will remain literal - with escape characters remaining in place */
STRING regexp = @"(\$\{([a-zA-Z][a-zA-Z0-9._]*)\})";
/* multi-line text block - equates to a java.lang.String instance */
TEXT my_multi_line_text = ///
Here is a line of text.
This is yet another. Here is a blank line:
Now picks up again.
///;
/* forward use of 'props' bean */
java.util.HashMap map {
 this( $props );
}
/* equates to a java.util.Propertis instance */
PROPERTIES props {
 "James Ward" = "Adobe Flex evangelist";
 "Stu Stern" = "Gorilla Logic - Flex Monkey test automation";
 Dilbert = "character in popular comic strip of same title";
 "App Title Display" = "Application: ${app.name}";
 "${app.desc}" = "JFig processes text-format Java configuration data";
}
/* equates to a java.util.ArrayList instance */
LIST list {
 this( ["dusty", "moldy", "${app.version}", $str] );
 [234, 9798.76, -98, .05, "numbers", $props, ["red", "green", "blue"]];
}
2 ответа

У меня мало опыта с XML-кодом Spring, который вы ссылаетесь, поэтому вы должны получить следующую обратную связь с щепоткой соли.

В качестве второго и третьего оговорок:

  • предоставляющий фрагмент кода, придаст вкус тому, что такое язык и его семантика. Трудно полностью понять некоторые из тех решений, которые вы уже сделали (и не без оснований), поэтому любая обратная связь здесь может быть совершенно противоречивой или невозможной в свете этих выборов.
  • языковой дизайн - это такое же искусство, как и наука, и поэтому на этом этапе любая обратная связь, которую вы можете получить, скорее всего, будет весьма субъективной.

Большой, мета-вопрос: как DSL вы пытаетесь выполнить настройку Spring или как более общий класс фреймворков?

Там: caveat emptor. Теперь моя субъективная и неполная обратная связь;)

  • Я не уверен, что понимаю, почему у вас префикс @ для scope и destroy-method, но не driverClassName. Кроме того, комбинация как xml-case, так и camelCase не полностью очевидна для начала. Является ли префикс @ модификатором типа или являются ли эти ключевые слова на языке?

  • Я не совсем уверен в ваших намерениях относительно формата заголовка блока. У вас есть имя класса, затем функция этого класса; это намерение указать, какой класс вы собираетесь использовать для определенной функции?

например.

sqlMapClient: org.springframework.orm.******.SqlMapClientFactoryBean {
 # body.
 }

или даже:

sqlMapClient {
 @class = org.springframework.orm.******.SqlMapClientFactoryBean;
 # is there a sensible (perhaps built-in) default if this is missing?
 }
  • Мне нравится замена переменных; Я полагаю, что значения будут получены из свойств System?

  • Мне нравится указывать строковые литералы (без экранирования), особенно для регулярных выражений, которые вы указали. Однако наличие многосимвольной цитаты или модификатора цитаты кажется немного чуждым. Думаю, вы считали одну кавычку (оболочка и Perl используют одиночные кавычки для литералов).

  • С другой стороны, я думаю, что тройной косой чертой для multi-line TEXT является правильный подход, но два напоминают комментарии на языках C-стиля. Для этой цели Python использует тройной ". Некоторые идиомы оболочки имеют многострочное текстовое соглашение, которое я бы не копировал.

  • Мне очень нравится внешний вид свойств и расположение конфигурации, используя то, что выглядит как URI-адресация адресации. Если это URI, classpath://file.xml может быть более четким. Однако у меня может быть неправильный конец палки.

  • Мне также очень нравится представление о листингах списка и карты, хотя я не уверен, где:

    • this входит в него (я думаю, вызов конструктора Java)
    • почему некоторые типы капитализируются, а другие - нет. Я полагаю, что существует тип по умолчанию MAP, который вы можете быть более конкретным, если хотите?
    • является ли Dilbert некорректным строковым литералом?

Наконец, я бы указал вам на другую конфигурацию DSL, хотя, возможно, больше для использования sysadmin: Puppet.

Хорошо.


Я предоставил немного фона в Spring и файл applicationContext.xml, который придаст ясность некоторым вещам, происходящим в синтаксисе SFig.

Файл applicationContext.xml используется для выражения инициализации bean для beans, который будет управляться Spring bean factory. Так, например, пример beans, видимый в моей версии SFig этого файла, в коде приложения Java можно запросить bean factory сделать экземпляр bean следующим образом:

SqlMapClient sqlMapClient = getBean("sqlMapClient");

bean factory заботится о любом экземпляре и инициализации, которые требуется bean - даже к точке ввода зависимостей. В этом случае SqlMapClient bean нуждается в экземпляре dataSource bean (который также описан и указан в примере SFig).

А bean дескриптор передает следующую информацию в bean factory:

  • имя класса bean Java
  • a bean ID, с помощью которого можно запрашивать или ссылаться на него
  • bean определение мета атрибутов (необязательно)
  • аргументы инициализации конструктора (необязательно)
  • и/или инициализаторы свойств

Префикс '@' содержит мета атрибуты определения bean. Это атрибуты, которые используются bean factory для управления bean. Например, @scope = singleton, сообщит bean factory, чтобы сделать один экземпляр bean, кешировать его и передать ссылки на него при его запросе. Те, которые могут быть установлены, являются теми же, что определены в Spring -Framework.

Если a bean должен быть инициализирован через конструктор, то это выражается в SFig синтаксисом, который, как представляется, вызывает это с аргументами в скобках.

Или bean можно инициализировать, установив его свойства. Идентификаторы, назначенные и не префиксированные '@', являются свойствами bean.

При ссылке на bean, который является требуемой зависимостью, тогда его можно называть путем префикса его bean ID с помощью '$'. Несколько примеров этого приведены в примере SFig.

Элемент ${foo.bar}, отображаемый в строковых литералах, будет заменен значением свойства Java. В этом случае свойства загружаются из файла application.properties через эту строку:

properties_include "classpath:application.properties";

Свойства Java System будут выглядеть следующим образом, если они не найдены ни в каких включенных свойствах. Это широко применяемая практика во многих средах Java. В текущем XML файле applicationContext.xml на основе XML есть способ разрешить это использование.

Поскольку java.util.Properties часто используется для инициализации beans, SFig предоставляет свойства как особый удобный синтаксис для объявления объекта Properties. Аналогично для java.util.List, который имеет соответствующий SFIG LIST. Кроме того, массивы значений могут быть объявлены в квадратных скобках [...].

Кроме того, существует TEXT для объявления блоков многострочного текста. "@", Префикс строкового литерала, означает отключить escape-кодирование - синтаксис языка, заимствованный из С#.

Одна из основных целей проектирования SFig DSL заключается в том, чтобы оставаться декларативным по своей природе. Я намеренно воздерживаюсь от добавления каких-либо императивных сценариев. Сложность логики программирования, встроенная в текстовый файл конфигурации, подразумевает возможность ее отладки. Не хотите открывать еще одно измерение отладки кода.

licensed under cc by-sa 3.0 with attribution.