2015-08-27 1 views
0

Мне нужно создать DSL (Domain Specific Language) с помощью команды groovy chain.Groovy: Застревает в проектировании DSL с переменными аргументами

Я следующий базу данных сотрудников

Name  Age Date-Of-Joining Salary 
Test  24  12-aug-2015  6000$ 

Мне нужно создать DSL, которая, как: -

имя обновление "test1", возраст до "26" и так далее.

Проблема заключается в следующем: - поля, которые могут быть обновлены, определяются пользователем, т.е. он может выбрать, какие столбцы будут обновлены и динамические.

So: - Обновление зарплаты до "7000 $" также должно работать.

Возможно ли создать такой динамический dsl? Если да, пожалуйста, предоставьте краткую информацию, чтобы продолжить такой проект.

Я уже разработал бэкэнд-систему, которая будет обновлять стоимость.

я не получаю, как получить значения из этого динамического

DSL

ответ

1

В DSL вы должны иметь какую-то информацию о том, какие должны были обновлены записи сотрудника (например, предоставление первичного ключа в таблице сотрудников).

Динамичность, которую вы хотели бы иметь в своем DSL, определенно возможна в Groovy. Смотрите этот небольшой пример в качестве отправной точки (этот пример не использует базу данных, чтобы сохранить его простым):

class Employee 
{ 
    String name 
    int age 
    int salary 

    public String toString() 
    { 
     "name=${name}, age=${age}, salary=${salary}\$" 
    } 

    def update(String attributeName) 
    { 
     ['to': { Object value -> 
      this[attributeName] = value 
      ['and': { String nextAttrName -> 
       update(nextAttrName) 
      }] 
     }] 
    } 
} 

Employee emp = new Employee(name: 'Test', age: 24, salary: 6000) 
println emp // name=Test, age=24, salary=6000$ 

emp.with 
{ 
    update 'name' to 'John' 
    println emp // name=John, age=24, salary=6000$ 

    update 'salary' to 7000 
    println emp // name=John, age=24, salary=7000$ 

    update 'name' to 'Michael' and 'age' to 48 
    println emp // name=Michael, age=48, salary=7000$ 
} 

Ваш DSL будет исполняемый код, так что вы будете не значения «Extract» но DSL будет вызывать бэкэнд-методы.

Существует очень хорошая презентация о создании DSL в Groovy: Creating Groovy DSLs that Developers Can Actually Use. В этой презентации много говорится о внутренних функциях DSL.

+0

Спасибо за ответ. Я обновил вопрос. Если я вызову DSL, кстати, я хочу, это дает нулевые значения. если я использую с закрытием {}, то только его работа. Как я могу получить значения без использования с закрытием? – user2332505

+0

@ user2332505 ваше обновление содержит только часть вашего кода; вы должны опубликовать фрагмент «runnable», чтобы продемонстрировать проблему. –

+0

спасибо большое. Я делал небольшую ошибку. Теперь работает – user2332505