Tech Talk:  Groovy 26.02.2008
Was ist Groovy? Dynamische Programmier-  und Skriptsprache für die Java-VM Konzepte von Python, Ruby, Smalltalk Durch hohe Integrationsmöglichkeiten mit Java   „ Javas bester Freund“  Open-Source Projekt bei codehaus.org
Eine Groovy Geschichte 2003 - Start durch James Strachan & Bob McWriter „Eleganz von Ruby in Java“ 2004 - Beginn der Standardisierung Java Specification Requests – 241 2004 - GroovyOne Groovy Entwicklertreffen in London Aktueller Projektleiter: Guillaume Laforge Anfang 2007 - Release 1.0 Ende 2007 - Release 1.5
Warum Javas bester Freund? (1) …  läuft in der Java Virtual Machine …  erweitert und nutzt die Bibliotheken des JDK …  kann auf Java-Klassen zugreifen …  kann von Java aufgerufen werden …  kann nach Java Classfiles compiliert werden Groovy…
Warum Javas bester Freund? (2) andere andere andere andere Java friendly Feature rich (Quelle: „Groovy in Action“, D. Koenig)
Was macht Groovy groovy? (1) Einfache Syntax: Semikolon, Klammern bei Methodenaufruf, Typangaben, Exception-Deklaration optional Closures Einfache Notation für Ranges, Listen und HashMaps „ public“ ist default Erweiterte  switch- Anweisungen
Was macht Groovy groovy?  (2) Alles ist ein Objekt getter- und setter-Methoden werden automatisch erzeugt  und beim Attribut-Zugriff automatisch genutzt Operator-Overloading Automatisch importierte Pakete: groovy.lang.*, groovy.util.*, java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, BigDecimal
The Groovy way to say Hello  (1) public class SayHello { public static void main (String[] args) { System.out.println( " hello " ); } } Java kompatibel
The Groovy way to say Hello  (2) class SayHello { static void main (String[] args) { System.out.println( " hello " ); } } public  ist default
The Groovy way to say Hello  (3) class SayHello { static void main (args) { System.out.println( " hello " ) } } Typangaben sind optional Semikolon optional
The Groovy way to say Hello  (4) class SayHello { static void main (args) { println( " hello " ) } } println  kennt jeder Klasse
The Groovy way to say Hello  (5) println( " hello " ) Keine Klassen für ausführbares Skript notwendig
The Groovy way to say Hello  (6) println  " hello " Klammern meist optional bei Methodenaufrufen
Die primitiven Datentypen (int, short byte, long, etc.) sind echte Groovy Objekte: def i = 1 Gleichheit von Objekten wird mit dem Operator == abgefragt assert i == new Integer(1) Identität von Objekten kann mit der Methode is() geprüft werden: def k = i assert i.is(k) assert !( i.is(new Integer(1)) ) Alles ist ein Objekt
Closure Einfache Closure: def c = { println 'hello' } c() Closure mit Parameter: sqare = { f -> return f * f} assert sqare(5) == 25 alternativ: degree = { it * it } Schleifen: 5.times { println 'hello' } oder: def sum = 0 1.upto(5) { sum += it } assert sum == 15
Ranges, Lists & Maps Wertebereiche als eigener Datentyp  5..10 Beispiel: sum = 0 (1..10).each { sum += it } (Array)Listen mit eigener Notation Beispiel: def list = [1, 2, 3] list.each { sum += it } assert list << 9 == [1, 2, 3, 9] assert [1, 2, 3] - [2] == [1, 3] assert [1, 2] * 2 == [1, 2, 1, 2] Direkte Notation für (Hash)Maps Beispiel: def map = [a: 1, b: 2, c: 3] assert map.get('a') == 1 assert map['a'] == 1 assert map.a == 1
Switch in Groovy  switch(v) { // Zahlen case 1: println 'Zahl 1'; break; // String case 'test': println 'String test'; break;  // Range case 10..15: println 'In Range 1..15'; break;  // Auswahl aus Liste case [1, '1', 'Eins']: println 'Irgenwie 1'; break;  // Regular Expression case ~/Ein.*/: println 'Fängt mit Ein an'; break;  default: println 'Default-Zweig'; break }
Groovy Strings GStrings erlauben Ausdrücke in Strings: def cal = new GregorianCalendar() println &quot;Monat: ${cal.get(Calendar.MONTH)+1}&quot; println &quot;Datum: $cal.time&quot; GStrings über mehrere Zeilen: def gs = &quot;&quot;&quot;Dieser GString hat zwei Zeilen. &quot;&quot;&quot; Klassische Java Strings (mehrzeilig mit ''' '''): def s = 'Java String' Strings für Regular Expressions (kein Escape für Backslash nötig):   assert 'Alles nur Worte' ==~ /((\w*) *)*/  //Vollständigen Bereich prüfen   assert 'Alles nur Worte' =~ /\w*/ // Auf einzelnen Treffer prüfen   def matcher = 'Alles nur Worte' =~ /\w*/ // Alle Treffer ausgeben    matcher.each { println it }
Builder Builder erlauben es, komplexe Datenstrukturen aufzubauen.  (GOF Pattern) Builder für: Groovy-Objekte: NodeBuilder XML, HTML: groovy.xml.MarkupBuilder Swing: SwingBuilder Ant: AntBuilder Eigene Builder über BuilderSupport
Builder (Beispiel) XML <tiere> <tier> <art text='Hund' /> </tier> <tier> <art text='Katze' /> </tier> <tier> <art text='Maus' /> </tier> </tiere> XML – Builder def b = new groovy.xml.MarkupBuilder() b.tiere { for (n in ['Hund','Katze','Maus']){ tier { art(text: n) } } }
XML Unterstützung in Groovy Einfaches Einlesen durch eingebauten Xml-Parser Zugriff auf XML-Daten durch GPath-Ausdrücke Erzeugen von XML durch XML-Builder Groovy als Alternative zu XSLT
XML-Parser (Beispiel) XML <tiere> <tier> <art text='Hund' /> </tier> <tier> <art text='Katze' /> </tier> <tier> <art text='Maus' /> </tier> </tiere> XML – Parser def t = new XmlParser().parseText(xml) // GPath auf das Object-Netz assert t.tier.art.'@text' == ['Hund', 'Katze', 'Maus']
Tolle andere Features von Groovy Unterstützung von JUnit Unterstützung von Datenbanken Unterstützung für XML
Fleisch und Knochen Aufteilung von Systemen in Java : Statische, stabile Komponenten, Laufzeit-kritisch (Knochen) Groovy : Dynamische, flexible Komponenten, hohe Anpaßbarkeit (Fleisch)
Quellen Wikipedia: http://de.wikipedia.org/wiki/Groovy Vortrag von Christof Vollrath beim 23rd Chaos Communication Congress, Dezember 2006 http://events.ccc.de/congress/2006/Fahrplan/events/1419.en.html
 

Tech Talk: Groovy

  • 1.
    Tech Talk: Groovy 26.02.2008
  • 2.
    Was ist Groovy?Dynamische Programmier- und Skriptsprache für die Java-VM Konzepte von Python, Ruby, Smalltalk Durch hohe Integrationsmöglichkeiten mit Java  „ Javas bester Freund“ Open-Source Projekt bei codehaus.org
  • 3.
    Eine Groovy Geschichte2003 - Start durch James Strachan & Bob McWriter „Eleganz von Ruby in Java“ 2004 - Beginn der Standardisierung Java Specification Requests – 241 2004 - GroovyOne Groovy Entwicklertreffen in London Aktueller Projektleiter: Guillaume Laforge Anfang 2007 - Release 1.0 Ende 2007 - Release 1.5
  • 4.
    Warum Javas besterFreund? (1) … läuft in der Java Virtual Machine … erweitert und nutzt die Bibliotheken des JDK … kann auf Java-Klassen zugreifen … kann von Java aufgerufen werden … kann nach Java Classfiles compiliert werden Groovy…
  • 5.
    Warum Javas besterFreund? (2) andere andere andere andere Java friendly Feature rich (Quelle: „Groovy in Action“, D. Koenig)
  • 6.
    Was macht Groovygroovy? (1) Einfache Syntax: Semikolon, Klammern bei Methodenaufruf, Typangaben, Exception-Deklaration optional Closures Einfache Notation für Ranges, Listen und HashMaps „ public“ ist default Erweiterte switch- Anweisungen
  • 7.
    Was macht Groovygroovy? (2) Alles ist ein Objekt getter- und setter-Methoden werden automatisch erzeugt und beim Attribut-Zugriff automatisch genutzt Operator-Overloading Automatisch importierte Pakete: groovy.lang.*, groovy.util.*, java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, BigDecimal
  • 8.
    The Groovy wayto say Hello (1) public class SayHello { public static void main (String[] args) { System.out.println( &quot; hello &quot; ); } } Java kompatibel
  • 9.
    The Groovy wayto say Hello (2) class SayHello { static void main (String[] args) { System.out.println( &quot; hello &quot; ); } } public ist default
  • 10.
    The Groovy wayto say Hello (3) class SayHello { static void main (args) { System.out.println( &quot; hello &quot; ) } } Typangaben sind optional Semikolon optional
  • 11.
    The Groovy wayto say Hello (4) class SayHello { static void main (args) { println( &quot; hello &quot; ) } } println kennt jeder Klasse
  • 12.
    The Groovy wayto say Hello (5) println( &quot; hello &quot; ) Keine Klassen für ausführbares Skript notwendig
  • 13.
    The Groovy wayto say Hello (6) println &quot; hello &quot; Klammern meist optional bei Methodenaufrufen
  • 14.
    Die primitiven Datentypen(int, short byte, long, etc.) sind echte Groovy Objekte: def i = 1 Gleichheit von Objekten wird mit dem Operator == abgefragt assert i == new Integer(1) Identität von Objekten kann mit der Methode is() geprüft werden: def k = i assert i.is(k) assert !( i.is(new Integer(1)) ) Alles ist ein Objekt
  • 15.
    Closure Einfache Closure:def c = { println 'hello' } c() Closure mit Parameter: sqare = { f -> return f * f} assert sqare(5) == 25 alternativ: degree = { it * it } Schleifen: 5.times { println 'hello' } oder: def sum = 0 1.upto(5) { sum += it } assert sum == 15
  • 16.
    Ranges, Lists &Maps Wertebereiche als eigener Datentyp 5..10 Beispiel: sum = 0 (1..10).each { sum += it } (Array)Listen mit eigener Notation Beispiel: def list = [1, 2, 3] list.each { sum += it } assert list << 9 == [1, 2, 3, 9] assert [1, 2, 3] - [2] == [1, 3] assert [1, 2] * 2 == [1, 2, 1, 2] Direkte Notation für (Hash)Maps Beispiel: def map = [a: 1, b: 2, c: 3] assert map.get('a') == 1 assert map['a'] == 1 assert map.a == 1
  • 17.
    Switch in Groovy switch(v) { // Zahlen case 1: println 'Zahl 1'; break; // String case 'test': println 'String test'; break; // Range case 10..15: println 'In Range 1..15'; break; // Auswahl aus Liste case [1, '1', 'Eins']: println 'Irgenwie 1'; break; // Regular Expression case ~/Ein.*/: println 'Fängt mit Ein an'; break; default: println 'Default-Zweig'; break }
  • 18.
    Groovy Strings GStringserlauben Ausdrücke in Strings: def cal = new GregorianCalendar() println &quot;Monat: ${cal.get(Calendar.MONTH)+1}&quot; println &quot;Datum: $cal.time&quot; GStrings über mehrere Zeilen: def gs = &quot;&quot;&quot;Dieser GString hat zwei Zeilen. &quot;&quot;&quot; Klassische Java Strings (mehrzeilig mit ''' '''): def s = 'Java String' Strings für Regular Expressions (kein Escape für Backslash nötig): assert 'Alles nur Worte' ==~ /((\w*) *)*/ //Vollständigen Bereich prüfen assert 'Alles nur Worte' =~ /\w*/ // Auf einzelnen Treffer prüfen def matcher = 'Alles nur Worte' =~ /\w*/ // Alle Treffer ausgeben matcher.each { println it }
  • 19.
    Builder Builder erlaubenes, komplexe Datenstrukturen aufzubauen. (GOF Pattern) Builder für: Groovy-Objekte: NodeBuilder XML, HTML: groovy.xml.MarkupBuilder Swing: SwingBuilder Ant: AntBuilder Eigene Builder über BuilderSupport
  • 20.
    Builder (Beispiel) XML<tiere> <tier> <art text='Hund' /> </tier> <tier> <art text='Katze' /> </tier> <tier> <art text='Maus' /> </tier> </tiere> XML – Builder def b = new groovy.xml.MarkupBuilder() b.tiere { for (n in ['Hund','Katze','Maus']){ tier { art(text: n) } } }
  • 21.
    XML Unterstützung inGroovy Einfaches Einlesen durch eingebauten Xml-Parser Zugriff auf XML-Daten durch GPath-Ausdrücke Erzeugen von XML durch XML-Builder Groovy als Alternative zu XSLT
  • 22.
    XML-Parser (Beispiel) XML<tiere> <tier> <art text='Hund' /> </tier> <tier> <art text='Katze' /> </tier> <tier> <art text='Maus' /> </tier> </tiere> XML – Parser def t = new XmlParser().parseText(xml) // GPath auf das Object-Netz assert t.tier.art.'@text' == ['Hund', 'Katze', 'Maus']
  • 23.
    Tolle andere Featuresvon Groovy Unterstützung von JUnit Unterstützung von Datenbanken Unterstützung für XML
  • 24.
    Fleisch und KnochenAufteilung von Systemen in Java : Statische, stabile Komponenten, Laufzeit-kritisch (Knochen) Groovy : Dynamische, flexible Komponenten, hohe Anpaßbarkeit (Fleisch)
  • 25.
    Quellen Wikipedia: http://de.wikipedia.org/wiki/GroovyVortrag von Christof Vollrath beim 23rd Chaos Communication Congress, Dezember 2006 http://events.ccc.de/congress/2006/Fahrplan/events/1419.en.html
  • 26.