web-dev-qa-db-ja.com

Groovyでいつdefを使用するのですか?

私はしばらくの間Groovyで開発しており、動的キャスティングdefをどのくらいの頻度で使用する必要があるのか​​疑問に思っています。私の同僚は、私が理解していない方法でGroovyを支援するため、常にそれを使用する必要があると考えています。

現在、メソッドの戻り値の型と引数を宣言するとき、どのオブジェクトを取り込んで吐き出すべきかを故意に述べたいと思います(コードを読みやすくするため、Java背景から来ているので、理解できます)例:

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

だから、私の質問は、それがdefをいつ使用するかの好みにすぎないのか、それとも常にそれを使用することの本当の利点があるのでしょうか? (最後の例は、Groovyの実行可能なオプションとして質問に適合すると感じたので追加しました)

24
PJT

プログラミング(スクリプティングを含む)の優れた実践として、変数には明確な(必ずしも具体的ではない)型を指定することを常に検討してください。変数に適用できる明確な型がない場合にのみ、defを使用します。

OPはJavaを認識しているため、Objectのタイプを指定することと何ら変わりはありません(ただし マイナーな違い があるようです)。この質問への答えは、「JavaでObject型を常に使用しないのはなぜですか?」のような質問への回答と同じです。

型についてできる限り明確にすることで、バグの可能性を減らし、自己文書化することさえできます。一方、ダイナミックロジックを故意に実装している場合は、defを使用するのが理にかなっています。これは実際、Groovyの最大の強みの1つです。プログラムは、必要に応じて動的または静的に型付けできます。怠惰が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")
    }
}
21
Gaurav Thapa

作成しているコードを他の人がパブリックAPIとして使用する場合は、常に強力な型指定を使用することをお勧めします。これにより、コントラクトを強化し、渡された引数の型の誤りを回避し、ドキュメントを改善し、さらに、 IDEコード補完あり。コードがプライベートメソッドのようにユーザー専用である場合、またはIDEが型を簡単に推測できる場合は、いつタイプするかを自由に決めることができます。

0
ASKAR