什么时候在Groovy中使用def?


23

我现在在Groovy中开发了一段时间,我想知道应该多久使用一次动态投射def?我的一位同事认为我们应该一直使用它,因为它以某种我不了解的方式对Groovy有所帮助。

当前,当声明方法的返回类型和参数时,我想刻意指出应该放入和吐出哪些对象(出于代码可读性,我来自Java背景对我来说很有意义)示例:

String doSomething(String something){
    //code
}
// vs
def doSomething(def somthing){
    //code
}
// vs 
def doSomething(somthing){
    // code
}

所以我想我的问题是,仅是何时使用的偏好,def还是一直使用它的真正优势?(我添加了最后一个示例,因为我认为它适合作为Groovy的可行选项的问题)


3
请参阅此处,您的同事相信什么:stackoverflow.com/questions/184002/…
RemigijusPankevičius2015年

在决定问这个问题之前,我实际上已经看到了该问题和答案。“在较大的脚本中,好的做法是始终使用“ def”关键字,这样您就不会遇到奇怪的作用域问题或干扰您不想要的变量。” 泰德·纳莱德 在决定省略任何类型还是在脚本中使用def时,对我来说听起来不错,但是声明方法返回类型和参数类型呢?什么是好习惯?
PJT 2015年

1
好,我现在明白你的意思了。这是关于强类型与动态编程的问题。我会尽量避免由于未来的火焰战争而讨论的类型:)
RemigijusPankevičius2015年

Answers:


20

作为良好的编程(甚至脚本编写)实践,请始终考虑为变量指定一个确定的(尽管不一定是具体的)类型。def仅当没有确定类型适用于变量时才使用。

由于OP知道Java,因此它与指定类型没有什么不同Object(尽管似乎有微小的区别)。这样,该问题的答案就不会与回答“为什么不总是Object在Java中使用类型?” 这样的问题有所不同。

尽可能明确地确定类型会减少发生错误的机会,甚至可以作为自我文档。而如果有人故意实现一种动态逻辑,那么使用def可能会很有意义。实际上,这是Groovy的最大优势之一。该程序可以根据需要进行动态或静态输入!只是不要让懒惰成为使用def;-) 的理由

例如,此方法对于确定的参数类型和返回类型有意义:

// def val or Object val, opens up the possibility
// of the caller sending a non-numeric value 
Number half(Number val) {  
    val/2
}

虽然此方法对类型有意义 def

// I'd let them pass an argument of any type; 
// type `Object` makes sense too
def getIdProperty(def val) {   
    if(val?.hasProperty('id')) {
        // I don't know the type of this returned 
        // value and I don't really need to care 
        return val.id            
    }
    else {
        throw new IllegalArgumentException("Argument doesn't have an 'id' property")
    }
}

-1

每当您要编写的代码将被其他人用作公共API时,您都应该始终支持使用强类型化,这有助于使契约更牢固,避免可能传递的参数类型错误,提供更好的文档,还有助于具有代码完成功能的IDE。只要代码只供您使用(例如私有方法),或者当IDE可以轻松推断类型时,您就可以自由决定何时键入或不键入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.