5

Ich sehe oft ein Muster in Situationen verwendet, wo wir Nachschlage-Code, der ausgeführt werden muss, bevor wir Zugriff auf ein Objekt haben. Wenn dieses Muster verwendet wird, beginnt in der Regel mit dem Wort with.Gibt es einen Namen für dieses Muster mit Verschlüssen?

Zum Beispiel haben wir die Kundendatensätze, die aus einer Datenbank abgerufen werden müssen, bevor wir sie verwenden können:

def withCustomer (id, closure) { 
    def customer = getCustomer(id) 
    closure(customer) 
} 

withCustomer(12345) { customer -> 
    println "Found customer $customer.name" 
} 

Groovy machen keine solche Unterscheidung zwischen Schließungen oder anonymen Funktionen. Vielleicht könnte ich fragen, ob es ein Name für dieses Muster mit anonymen Funktionen ist.

Antwort

4

Dies ist das Strategie-Muster. Die Closure enthält ein bestimmtes Verhalten, das als Argument an die Funktion übergeben wird, damit die Funktion verschiedene Verhaltensweisen akzeptieren kann. Siehe Peter Norvig Präsentation Design Patterns in Dynamic Languages:

Die Strategie ist eine Variable, dessen Wert eine Funktion (zum Beispiel mit erstklassigen Funktionen, Muster unsichtbar)

+0

Was denkst du über [@mgryszko antwort] (http://stackoverflow.com/a/10093625/462015) –

+0

@ Arturo: Ich hatte gedacht, Vorlage-Methode wie notwendig Vererbung, wo Strategie eine Alternative dazu war, nicht eine Form davon. http://tech.puredanger.com/2007/07/03/pattern-hate-template/ –

+0

Was denkst du über [meine eigene Antwort] (http://stackoverflow.com/a/10306434/462015)? –

2

In Groovys Closures - Formal Definition ist es nur "Passing Closures zu Methoden".

Groovy hat einen Sonderfall für Verschlüsse als Methodenargumente Festlegung der Verschluss Syntax leichter lesbar zu machen. Insbesondere dann, wenn das letzte Argument einer Methode vom Typ Closure ist, können Sie das Verfahren mit einem expliziten Verschlussblock außerhalb der Klammer aufzurufen. Zum Beispiel, wenn eine Klasse eine Methode hat:

class SomeCollection { 
    public void each (Closure c) 
} 

Dann können Sie each() mit einer Verschluss Definition außerhalb der Klammer aufzurufen:

SomeCollection stuff = new SomeCollection(); 
stuff.each() { println it } 

Die traditionelle Syntax ist ebenfalls verfügbar, und auch beachten Sie, dass Sie in Groovy Klammer in vielen Situationen elide können, so dass diese beiden Varianten sind auch legal:

SomeCollection stuff = new SomeCollection(); 

stuff.each { println it }  // Look ma, no parens 
stuff.each ({ println it }) // Strictly traditional 

die gleiche Regel gilt auch dann, wenn das Verfahren andere Argumente hat. Die einzige Einschränkung ist, dass die Schließung Argument letzten Mal gewesen sein muss:

class SomeCollection { 
    public void inject (x, Closure c) 
} 

stuff.inject(0) { count, item -> count + item }  // Groovy 
stuff.inject(0, { count, item -> count + item }) // Traditional 

, die nicht die „Groovy Frage“ relevant sein können, aber zum Beispiel in Scala, diese „Form“ ist ein Sonderfall von Funktion currying:

scala> def fun[A, B](a: A)(b: B) = {true} 
fun: [A, B](a: A)(b: B)Boolean 

scala> fun(1){2} 
res59: Boolean = true 
+0

Danke für die Antwort, aber Sie fragen nicht meine Frage. Ich habe den Namen dieses Musters gefragt, nicht die Verwendung von Verschlüssen. –

+0

Dies ist kein Muster, sondern eine Syntaxform, und der Name für diese Syntaxform in Groovy lautet "** Closings an Methoden übergeben **". Wenn Sie näher am Wort "pattern" sein möchten, ist ein Beispiel in Scala "** function currying **" (obwohl es viel mehr gibt, was Sie mit Scalas Funktion currying tun können als diese Syntaxform, aber es passiert einfach einer der Spezialfälle sein). – tolitius

1

Es hängt vom Kontext ab. Es kann ein Strategie-Muster sein (siehe Nathan Hughes 'Antwort). Dies kann ein Template-Method-Muster sein.

Arturos Beispiel scheint eine Template-Methode zu sein. Sie definieren allgemeine Algorithmusschritte (in diesem Fall einen Kunden) und Anpassungen (die als Abschluss übergeben werden).

+0

Was denkst du über [meine eigene Antwort] (http://stackoverflow.com/a/10306434/462015)? –

1

Schließlich denke ich, dass dieses Muster Loan Pattern genannt wird.

Loan Pattern, stellt sicher, dass eine Ressource deterministisch entsorgt wird, sobald sie den Gültigkeitsbereich verlässt.

Sie können einige Informationen über dieses Muster siehe hier:

Verwandte Themen