Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Peter Niederwieser on Groovy

Peter Niederwieser on Groovy

More Decks by Enterprise Java User Group Austria

Other Decks in Technology

Transcript

  1. Über mich • Chief Engineer bei Smarter Ecommerce GmbH •

    Programming language & chocolate addict • Groovy, Scala, Clojure, (Java) • Lindt Dunkel 75% • Groovy Committer • Autor des Spock Frameworks
  2. Was ist Groovy? • Programmiersprache für die JVM • Leichtgewichtige

    Alternative/Ergänzung zu Java • Dynamisch typisiert • Ausdrucksstark • Flexible Syntax • “Programs are written by programmers for programmers” • “Make simple things easy, and difficult things possible”
  3. Getting Started 1. (Java 5 installieren) 2. Groovy Distribution herunterladen

    http://groovy.codehaus.org/Download 3. GROOVY_HOME auf entpacktes Verzeichnis setzen 4. GROOVY_HOME/bin zum Pfad hinzufuegen 5. >groovyConsole(.bat) • Noch einfacher: Windows Installer • Noch einfacher: Groovy Web Console http://groovyconsole.appspot.com/
  4. HelloWorld.java public class HelloWorld { private String name; public String

    getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  5. HelloWorld.groovy > mv HelloWorld.java HelloWorld.groovy > groovy HelloWorld.groovy • Gültiger

    Java-Code ist fast immer gültiger Groovy-Code • Wer Java kennt, kennt Groovy!
  6. HelloWorld.groovy Optionale Syntax public class HelloWorld { private String name;

    public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  7. HelloWorld.groovy Optionale Syntax class HelloWorld { private String name String

    getName() { name } void setName(String name) { this.name = name } String greet() { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName "Groovy" System.out.println helloWorld.greet() } }
  8. HelloWorld.groovy Properties class HelloWorld { private String name String getName()

    { name } void setName(String name) { this.name = name } String greet() { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName "Groovy" System.out.println helloWorld.greet() } }
  9. HelloWorld.groovy Properties class HelloWorld { String name String greet() {

    "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  10. HelloWorld.groovy Dynamische Typisierung class HelloWorld { String name String greet()

    { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  11. HelloWorld.groovy Dynamische Typisierung class HelloWorld { def name def greet()

    { "Hello " + name } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  12. HelloWorld.groovy String-Interpolation Haeufig verwendete Funktionen class HelloWorld { def name

    def greet() { "Hello " + name } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  13. HelloWorld.groovy String-Interpolation Haeufig verwendete Funktionen class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } }
  14. HelloWorld.groovy Namensparameter Automatisch erzeugter Konstruktor class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } }
  15. HelloWorld.groovy Namensparameter Automatisch erzeugter Konstruktor class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet() } }
  16. HelloWorld.groovy Skripts class HelloWorld { def name def greet() {

    "Hello $name" } static main(args) { def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet() } }
  17. HelloWorld.groovy Skripts class HelloWorld { def name def greet() {

    "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  18. HelloWorld.groovy Vorher/Nachher public class HelloWorld { private String name; public

    String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello" + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } } class HelloWorld { def name def greet() { "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  19. Java vs. Groovy • Gültiger Java-Code ist (fast immer) gültiger

    Groovy-Code • Groovy unterstützt Annotations, Generics, Enums, Varargs, usw. • Java-Klasse ist Groovy-Klasse und umgekehrt • Können sich gegenseitig rufen, voneinander ableiten, zirkuläre Abhängigkeiten haben • Groovy erweitert die Java-Standardbibliothek
  20. Neue Sprachelemente Literale • Listen [] [1, 2, 3] •

    Ranges (0..3) (‘a’..’z’) • Maps [:] [peter: “groovy”, juergen: “spring”] • BigDecimals 3.141592654 • Reguläre Ausdrücke /\+d/
  21. Neue Sprachelemente Default-Werte für Parameter Namensparameter class Person { String

    name String city int age def sing(song = “let it be”) { ... } } def person = new Person(name:”peter”, city: “linz”, age: 33) person.sing() person.sing(“yellow submarine”)
  22. Neue Sprachelemente Operator Overloading Power Asserts class Person { int

    age def plus(other) { new Person(age: age + other.age) } String toString() { "I'm $age years old" } } def person1 = new Person(age: 11) def person2 = new Person(age:22) def mixedPerson = person1 + person2 assert mixedPerson.age == 33
  23. Neue Sprachelemente Closures • Wiederverwendbare Code-Blöcke • Bekannt aus JavaScript,

    Ruby, ... (Java 7?) • Ersetzen oft anonyme innere Klassen kürzer, flexibler, mächtiger • Wirken sich auf Design von Bibliotheken aus
  24. Neue Sprachelemente Closures def greet = { name -> println

    “Hello $name” } greet(“Groovy”) def greet = { println “Hello $it” } def greet2 = greet greet2(“Groovy”) def listener = { event -> /* handle event */ } as ActionListener
  25. Neue Sprachelemente Iteratoren • Iteratoren für viele Standardtypen Collections Ranges

    Strings Pattern Matches Dateien ... • Groovy macht das “Richtige”
  26. Neue Sprachelemente Iteratoren [1,2,3].each { println it } (1..3).each {

    println it} for (x in [1,2,3]) println x for (x in 1..3) println x for (ch in "hagenberg") println ch
  27. Neue Sprachelemente GPath • Navigation durch Objekt-Graphen • Ähnlich wie

    XPath, aber für beliebige Objekte • Wichtige Bestandteile: ?. *. Property-Notation
  28. Neue Sprachelemente GPath class Person { def name; def age;

    def hobby } def persons = [] persons << new Person(name: "peter", age: 33, hobby: "groovy") persons << new Person(name:"chris", age:28) assert persons.age == [33, 28] assert persons*.getName() == ["peter", "chris"] assert persons[2]?.name == null assert persons[0].hobby ?: "no hobbies" == "groovy" assert persons[1].hobby ?: "no hobbies"== "no hobbies"
  29. Standardbibliothek • Groovy erweitert Java Klassen um viele neue Methoden

    • Volle Kompatibilität zu Java bleibt erhalten! • Zusätzlich neue APIs, die das Leben erleichtern • XML Parsing • Datenbankzugriff • HTML Generierung • und vieles mehr...
  30. Standardbibliothek Neue Methoden für Java Collection API def list =

    [1,2,3] assert list instanceof ArrayList assert list.min() == 1 assert list.max() == 3 assert list.collect { it**2 } == [1, 4, 9] assert list.grep { it > 1 } == [2, 3] • Viele weitere Erweiterungen des Java APIs, deklariert in Klasse DefaultGroovyMethods
  31. Standardbibliothek Unveränderbare Objekte, Java Version public class Person { private

    final String first; private final String last; public String getFirst() { return first; } public String getLast() { return last; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (first == null) { if (other.first != null) return false; } else if (!first.equals(other.first)) return false; if (last == null) { if (other.last != null) return false; } else if (!last.equals(other.last)) return false; return true; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((first == null) ? 0 : first.hashCode()); result = prime * result + ((last == null) ? 0 : last.hashCode()); return result; } @Override public String toString() { return "Person(first:" + first + ", last:" + last + ")"; } }
  32. Standardbibliothek MarkupBuilder import groovy.xml.* def page = new MarkupBuilder() page.html

    { head { title ‘Hello’ } body { ul { for (count in 1..5) { li “world $count” } } } } <html> <head> <title>Hello</title> </head> <body> <ul> <li>world 1</li> <li>world 2</li> <li>world 3</li> <li>world 4</li> <li>world 5</li> </ul> </body> </html>
  33. Metaprogrammierung Fehlende Methoden fangen class Person { def methodMissing(String name,

    Object args) { println name } } def person = new Person() person.doYouUnderStandMe()
  34. Metaprogrammierung ExpandoMetaClass List.metaClass.firstElement { -> delegate[0] } def list =

    [1,2,3] assert list instanceof ArrayList assert list.firstElement() == 1 • Groovy APIs (z.B. Builders) verwendet oft diesen und andere Metaprogrammierungs-Tricks
  35. Kompilieren und Ausführen • Kommandozeile groovy, groovyc, groovysh • Groovy

    (Web) Console • Build Tools Ant, Maven, Gradle • IDEs IDEA, Eclipse, NetBeans
  36. Einsatzmöglichkeiten • Entwicklung kompletter Anwendungen • Shell-Skripting • Erweitern bestehender

    Anwendungen um Skriptbarkeit • Entwicklung von Web- und Desktop-Anwendungen (Grails, Gaelyk, Griffon, ...) • Als Buildwerkzeug (Gant, Gradle, ...) • Zum Testen von Groovy und Java Code (easyB, GMock, Spock) • Beispiele: SmecoScript und Spock
  37. Einsatzmöglichkeiten Spock Framework • Test-Framework im Stil von JUnit •

    Geeignet für alle Arten von Entwickler-Tests • Erleichtert Testen von Groovy und Java Code • Einige Highlights: Sprechende Test-Namen Power Asserts Data-driven Tests Eingebautes Mock-Framework Einfach erweiterbar Plugins fuer Guice, Spring, Unitils, Grails, ...
  38. Buchempfehlung & Links • Dirk König et al: Groovy in

    Action (2nd Ed) • Groovy http://groovy.codehaus.org • Grails http://grails.org • Gradle http://gradle.org • Spock http://spockframework.org • Smarter Ecommerce GmbH http://smarter-ecommerce.com
  39. Quellen • Paul King: Groovy Tutorial http://www.slideshare.net/paulk_asert/groovy-tutorial • Andres Almiray:

    Introduction to Groovy http://www.slideshare.net/aalmiray/redev-09-introduction-to-groovy