Groovy:坚持用可变参数设计DSL

时间:2015-08-27 07:14:59

标签: groovy dsl

我需要使用groovy chain命令设计DSL(域特定语言)。

我有以下员工数据库

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

我需要创建一个类似于: -

的DSL

将名称更新为" test1" ,年龄为" 26" 等等。

问题是: - 可以更新的字段是用户定义的,即他/她可以选择,哪些列将更新及其动态。

所以: - 将薪水更新为" 7000 $"也应该有效。

是否有可能创建这样的动态dsl?如果是这样,请提供一些简要信息,以便继续进行此类设计

我已经开发了后端系统,它将更新价值。

我没有得到如何从这个动态dsl中获取值

1 个答案:

答案 0 :(得分: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将是可执行代码,因此您无法提取'值但DSL会调用你的后端方法。

有关在Groovy中创建DSL的非常好的演示:Creating Groovy DSLs that Developers Can Actually Use。这个演讲讲述了很多关于DSL内部的内容。