Groovy

Werbung
Groovy für Java Programmierer
20. Juli 2015
Stefan Kolatzki
Übersicht
• Karriere bei LINEAS
• Groovy für Java Programmierer
• Closures
• Literale, Operatoren, Operatoren überladen
• Extensions
• Compilerverhalten erweitern
• Domain Specific Languages
• Live Demo
Karriere bei LINEAS
Wir über uns
• IT-Dienstleister und Software- und
Beratungshaus in Niedersachsen
• Standorte in Braunschweig und Wolfsburg
• ca. 100 Mitarbeiter
• hoher qualitativer Anspruch in allen
Bereichen mit maßgeschneiderten,
zukunftssicheren und integrierten Lösungen
• hochqualifizierte Mitarbeiter durch
kontinuierliche Weiterbildung und
Zertifizierung
• neueste Technologien um bestmögliche
Ergebnisse und hohen Kundennutzen zu
erzielen
Kunden
Karriere
•
•
•
•
•
•
•
•
•
Flache Hierarchien und ein familiäres
Arbeitsumfeld
Individuelle Entwicklungsmöglichkeiten
Regelmäßige Feedbackgespräche
Unbefristete Arbeitsverträge
Dienstwagenmodelle
Fitnessstudiozuschüsse und Massagen
Gemeinsame Betriebsfeiern und Events
Montags frisches Obst, Freitags Süssigkeiten
Kaffee, Tee, Wasser …
Softwareentwickler Java
Softwareentwickler C / C++
Softwareentwickler Grails / AngularJs
Kontakt
LINEAS Informationstechnik GmbH
Theodor-Heuss-Str. 2
38122 Braunschweig
Telefon +49 (531) 8852 0
Web: www.lineas.de
Victoria Mahler, Personalleiterin
+49 (531) 8852 - 1124
[email protected]
Groovy
für Java Programmierer
„Groovy ist wie Java,
nur ohne das
Semikolon.“
Unbekannt
;
Danke für ihre
Aufmerksamkeit
Groovy
•
•
•
•
Dynamische Programmiersprache
•
Dynamische Typisierung (def als dynamischer Typ)
•
Typinferenz mit Flussanalysen (if(user instanceof User){...})
•
Erweiterte Methodensuche beim Aufruf
•
Aufruf von undefinierten Methoden
JVM als Zielplattform
Superset von Java (mit kleinen Einschränkungen)
Funktionale Aspekte
•
Funktionen höherer Ordnung
•
Rekursion
•
Typinferenz
•
Operationen auf Listen
Closures
•
•
•
Funktion mit Zugriff auf den Erstellungskontext
Als Funktion höherer Ordnung nutzbar
Beispiel:
int value = 5
def cFun = { int add ->
return value + add
}
assert cFun(10)==15
Zusätzliche Literale (Auswahl)
•
•
Listen / Mengen
•
List<String> values = ["C++", "Java", "C#"]
•
Set<String> values = ["C++", "Java", "C#"]
Maps
•
•
•
Map<String,Integer> values = ["C++":4, "Java":5, "C#": 3]
Wertebereiche
•
List<Integer> values = 5..9 //==[5,6,7,8,9]
•
List<Integer> values = 5..<9 //==[5,6,7,8]
Strings
•
String javaString = 'Dies ist ein normaler Java String.'
•
String interpolated = "String mit Werten: ${values}."
•
String multiLine = """String über mehrere Zeilen."""
Zusätzliche Operatoren (Auswahl)
•
N-te Potenz
•
•
Elvis Operator
•
•
•
String value = user?.name
Spread Operator
•
•
String value = name ?: "John" // name ? name : "John"
Safe Navigation
•
•
int value = 2**3 // == 8
List<String> names = users*.getName()
Spaceship
•
int compare = 1 <=> 1 // == 0
•
int compare = 'a' <=> 'z' // == -1
Subscript
•
User user = users[3] // user instanceof List<User>
Operatoren überladen
• Mapping von Operatoren auf Funktionsnamen
class Complex{
Complex negative(){…}
Complex plus(final Complex value){…}
Complex minus(final Complex value){…}
...
}
void test(Complex a, Complex b){
Complex c = -a
Complex d = a + b
Complex e = b - d
...
}
Extensions
•
•
•
•
Erweiterungen für existierende Klassen
Statische und Instanzmethoden möglich
Registrierung in META-INF Beschreibungsdatei
Extensions in Groovy Runtime
•
Collections
• collect()
•
Streams
•
…
• Beispiel:
static <T> T sample(final Collection<T> self) {
final int index = new Random().nextInt(self.size())
return (self as List).get(index)
}
Compilerverhalten erweitern
•
Anpassen des Groovy Compileverhaltens per Annotationen
•
Compile-Time Metaprogramming
•
Eingebaute Umformungen in Groovy
• @groovy.transform.ToString
• @groovy.lang.Singleton
• @groovy.util.logging.Commons
• @groovy.transform.CompileStatic
• …
•
•
Direkter Zugriff auf abstrakten Syntaxbaum
•
Einordnung der Umwandlung zu Compilerphase
Beispiel
•
Spock DataDriven Testing
•
Grails Domain-Klassen / Services
Domain Specific Languages
email {
from '[email protected]'
to '[email protected]
subject 'Hire me…'
body { p 'Hi there. I'am a …' }
}
Verwendet Methoden von
class EmailSpec {
void from(String from) { println "From: $from"}
void to(String... to) { println "To: $to"}
void subject(String subject) { println "Subject: $subject"}
void body(Closure body) {
def bodySpec = new BodySpec()
def code = body.rehydrate(bodySpec, this, this)
code.resolveStrategy = Closure.DELEGATE_ONLY
code()
}
}
Weiteres
•
•
Traits (Interfaces mit Implementierungen)
Standard Sichtbarkeit ist public
•
•
Mischen von Groovy und Java Klassen
Erweiterte Typumwandlung
•
Typen müssen nicht zwingend Zuweisungskompatibel sein
•
Coercion Operator (… as <TYPE>)
• list as Set
• 5 as String
•
Feldzugriff über (generierte) Getter + Setter
•
user.name übersetzt zu user.getName()
•
Vergleichsoperator == verwendet equals Methode
•
•
•
Methodenüberladungen mit Default-Werten
Letzter Ausdruck einer Methode/Closure ist Rückgabewert
…
Live Demo
Pros und Cons
•
•
Pros
•
Weniger Code
•
Funktionale Programmierung
•
Schnellere Entwicklung
•
Flexibel Erweiterbar
Cons
•
Fehleranfälliger durch dynamische Typisierung
•
Etwas langsamer als Java
•
Debugging von dynamischen Funktionsaufrufen schwierig
Danke für ihre
Aufmerksamkeit
Quellen
•
Groovy
•
•
•
"Mazes for Programmers"
•
James Buck
•
The Pragmatic Programmers, LLC. 30.06.2015
Spock Framework
•
•
http://spockframework.org
The Grails Framework
•
•
http://groovy-lang.org
http://grails.org
Gradle
•
https://gradle.org
Herunterladen