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
}

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ć.


17

Klarowność jest królem.

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


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.