web-dev-qa-db-ja.com

Groovyで明示的なreturnステートメントを書くのはいつですか?

現在、Groovy/Grailsプロジェクト(かなり新しいプロジェクト)に取り組んでおり、Groovyメソッドでreturnキーワードを省略することは良い方法かどうか疑問に思っています。私が知る限り、あなたは明示的にキーワードを挿入する必要があります、つまりガード句のために、他のどこでもそれを使用するべきですか?私の意見では、追加のreturnキーワードは読みやすさを向上させます。それとも、慣れる必要があるだけですか?そのトピックについてのあなたの経験は何ですか?

いくつかの例:

def foo(boolean bar) {
    // Not consistent
    if (bar) {
        return positiveBar()
    }
    negativeBar()
}

def foo2() {
    // Special Grails example
    def entitiy = new Entity(foo: 'Foo', bar: 'Bar')
    entity.save flush: true
    // Looks strange to me this way
    entity
}
21

後で来てコードを更新/保守する可能性のあるすべての人(自分を含む)に意図を明確にするので、私は間違いなく復帰を追加します。

そうでなければ、タイプミスのように見えるかもしれません。

もう1つは、voidを返すと予想される関数/クロージャーを 'void'として宣言することを忘れないでください。これも、将来のメンテナーに、何をしようとしているのかを明確にするためです。

7
adrianmcmenamin

明快さは王様です。

あなたがそれを書いた後にあなたのコードを読まなければならない仲間のプログラマーに最も明確なことをしてください。

17
Robert Harvey

Returnステートメント( Source )を省略するための引数は次のとおりです。

Groovyの控えめな機能

背景

私はしばらくの間、Groovyを使用してきましたが、評価された最後の式の暗黙的な戻りという1つの機能を嫌っています。例えば:

def getFoo() {
  def foo = null
  if (something) {
    foo = new Foo()
  }
  foo // no 'return' necessary
}

上記のコードでは、returnを使用した方が安全だと感じました。私は(明示的な返品に関して)エリックの投稿に同意する傾向がありました。

啓示

私はそれを手に入れました、そしてそれはすべてGroovyの強化されたコレクションメソッドのおかげです。

Collectメソッドを検討してください。関数を適用してリストを変換します。擬似コード:

[ a, b, c, d] => [ f(a), f(b), f(c), f(d) ]

それを念頭に置いて、ここに別の例があります:

class Composer {
  def name
  // def era, etc
}

def list = [ 'Bach', 'Beethoven', 'Brahms' ]

// the closure returns the new Composer object, as it is the last
// expression evaluated.

def composers = list.collect { item -> new Composer(name : item) }

assert 'Bach' == composers[0].name

アイデアは、単に文字列のリストからComposerオブジェクトのリストを作成することです。コメントに記載されているように、collectに渡されるクロージャーは、暗黙のreturnを使用して大きな効果をもたらします。その考えを表現するのに3〜4行かかるでしょう。

しかし、今、このコードは単に簡潔ではありません。本当にエレガントです。 Pythonなどの他の言語を非常に連想させます。

お持ち帰りメッセージ

Groovyの優れた機能のリストは多数あります。ただし、「暗黙のリターン」が表示されることはほとんどありません。私はファンです。他の機能のためにホイールに油を差します。

私はそれが多くの言語で利用可能であることを理解しています:私はGroovyでそれを使用したことがありません。数週間でそれなしでは生きられないと思う。

8
Chad