View
7
Download
0
Category
Preview:
Citation preview
20. Juli 2015
Groovy für Java Programmierer
Stefan Kolatzki
• Karriere bei LINEAS
• Groovy für Java Programmierer
• Closures
• Literale, Operatoren, Operatoren überladen
• Extensions
• Compilerverhalten erweitern
• Domain Specific Languages
• Live Demo
Übersicht
Karriere bei LINEAS
• 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
Wir über uns
Kunden
• 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 …
Karriere
Softwareentwickler Java
Softwareentwickler Grails / AngularJs
Softwareentwickler C / C++
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
personal@lineas.de
Kontakt
Groovyfür Java Programmierer
„Groovy ist wie Java,
nur ohne das
Semikolon.“
;
Unbekannt
Danke für ihre
Aufmerksamkeit
• 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
Groovy
• 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
Closures
• 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 Literale (Auswahl)
• N-te Potenz
• int value = 2**3 // == 8
• Elvis Operator
• String value = name ?: "John" // name ? name : "John"
• Safe Navigation
• String value = user?.name
• Spread Operator
• 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>
Zusätzliche Operatoren (Auswahl)
• 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
...
}
Operatoren überladen
• 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)
}
Extensions
• 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
Compilerverhalten erweitern
email {
from 'candidate@tu-bs.de'
to 'personal@lineas.de
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()
}
}
Domain Specific Languages
• 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
• …
Weiteres
Live Demo
• Pros
• Weniger Code
• Funktionale Programmierung
• Schnellere Entwicklung
• Flexibel Erweiterbar
• Cons
• Fehleranfälliger durch dynamische Typisierung
• Etwas langsamer als Java
• Debugging von dynamischen Funktionsaufrufen schwierig
Pros und Cons
Danke für ihre
Aufmerksamkeit
• Groovy
• http://groovy-lang.org
• "Mazes for Programmers"
• James Buck
• The Pragmatic Programmers, LLC. 30.06.2015
• Spock Framework
• http://spockframework.org
• The Grails Framework
• http://grails.org
• Gradle
• https://gradle.org
Quellen
Recommended