Kiedy napisać wyraźną instrukcję zwrotną w Groovy?

21

Obecnie pracuję nad projektem Groovy / Grails (w którym jestem całkiem nowy) i zastanawiam się, czy dobrą praktyką jest pominięcie returnsłowa kluczowego w metodach Groovy. O ile wiem, musisz jawnie wstawić słowo kluczowe, np. Dla klauzul ochronnych, więc czy należy go używać także wszędzie indziej? Moim zdaniem dodatkowe returnsłowo kluczowe zwiększa czytelność. A może po prostu musisz się przyzwyczaić? Jakie masz wrażenia z tego tematu?

Kilka przykładów:

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
}
Roland Schneider
źródło
Podobny problem występuje w Perlu: funkcja zwraca ostatnio ocenione wyrażenie przy braku returninstrukcji. Osobiście zawsze używam tego jawnego return, ale nie znam Groovy.
Keith Thompson,
2
Osobiście użyłbym domniemanego return tylko wtedy, gdy jest to całkowicie jasne. toStringjest typowym przykładem: jest to jednowierszowy, a obliczona wartość jest oczywiście wartością zwracaną. Ale z drugiej strony nie zaprogramowałem wystarczająco dużo Groovy, aby wiedzieć, czy pasuje to do tego, co myśli większa społeczność.
Joachim Sauer

Odpowiedzi:

7

Z pewnością dodałbym zwrot, ponieważ dzięki temu intencja staje się bardziej zrozumiała dla każdej osoby (w tym ciebie), która może przyjść i zaktualizować / zachować kod później.

W przeciwnym razie może to wyglądać na błąd pisania.

Inną rzeczą jest pamiętanie o zadeklarowaniu funkcji / zamknięć, które powinny zwrócić void jako „void” - ponownie, aby wyjaśnić przyszłym opiekunom, co próbujesz zrobić.

adrianmcmenamin
źródło
17

Klarowność jest królem.

Zrób to, co jest najbardziej jasne dla programisty, który musi przeczytać kod po jego napisaniu.

Robert Harvey
źródło
8

Oto argument za pominięciem instrukcji return ( Źródło ):

Niedoceniana funkcja w Groovy

tło

Przez jakiś czas współpracowałem z Groovy, ale byłem przeciwny jednej funkcji: niejawnego zwrotu ostatniego ocenionego wyrażenia. Na przykład:

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

W powyższym kodzie użyłbym return, ponieważ wydawało mi się to bezpieczniejsze. Zazwyczaj zgadzałem się z postem Erica (w odniesieniu do wyraźnych zwrotów).

Objawienie

Rozumiem teraz, a to wszystko dzięki ulepszonym metodom zbierania w Groovy.

Rozważ metodę zbierania. Przekształca listę poprzez zastosowanie funkcji. W pseudokodzie:

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

Mając to na uwadze, oto kolejny przykład:

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

Chodzi o to, aby zbudować listę obiektów Composer z listy ciągów znaków. Jak zauważono w komentarzu, zamknięcie przekazane do zbierania wykorzystuje ukryty powrót do wielkiego efektu. Kiedyś wyraziłbym ten pomysł 3-4 wiersze.

Ale teraz ten kod jest nie tylko zwięzły: jest naprawdę elegancki. Bardzo przypomina inne języki, takie jak Python.

Wiadomość z domu

Istnieje wiele list doskonałych funkcji Groovy. Jednak rzadko widujemy „ukryty zwrot” na liście. Jestem fanem: smaruje koła dla innych funkcji.

Zdaję sobie sprawę, że jest dostępny w wielu językach: po prostu nie użyłem go w Groovy. Podejrzewam, że za kilka tygodni nie będę mógł bez niego żyć.

Czad
źródło