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/...
レミジウスパンケビチウス

この質問をする前に、実際にその質問と回答を見ました。「より大きなスクリプトでは、常に "def"キーワードを使用することで、奇妙なスコープの問題に遭遇したり、意図しない変数に干渉したりしないようにすることをお勧めします。-テッド・ナレイド。型を省略するか、スクリプトでdefを使用するかを決定するとき、どちらがいいと思いますが、メソッドの戻り値の型と引数の型を宣言するのはどうですか?良い習慣とは何ですか?
PJT

1
さて、あなたの要点がわかりました。強く型付けされたプログラミングと動的プログラミングに関する質問です。議論のタイプは、先の火炎戦争のために避けようとしています:)
レミジウスパンケビチウス

回答:


20

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

OPはJavaを知っているので、タイプを指定することと違いはありませんObject(ただし、わずかな違いがあるようです)。この質問に対する答えは、「なぜObjectJavaで常に型を使用しないのか」などの質問に答えることと変わりません。

型について可能な限り明確にすることは、バグの可能性を減らし、さらに自己文書化としても役立ちます。一方、ダイナミックロジックを意図的に実装している場合は、使用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")
    }
}

-1

書いているコードが他の人によってパブリックAPIとして使用されるときはいつでも、強い型付けの使用を常に支持すべきです。それは、コントラクトをより強くし、渡される引数のタイプミスを防ぎ、より良いドキュメントを提供し、コード補完を備えたIDE。コードがプライベートメソッドのように使用専用である場合、またはIDEが型を簡単に推測できる場合は、いつ入力するかを自由に決定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.