Groovy baby

Aus dem kontext…

eine kleine einführung in das „ach so schöne“ Groovy (achtung Autor ist stark vorurteilsbehaftet… hin zu groovy).

Als erstes - Groovy ist keine Skriptsprache… Es ist eine dynamische Sprache für die JVM die ebenso in Java byte code kompiliert wird und demnach in einer JVM ausgeführt werden muss.

Man kann Groovy wild mit Java mischen wie man Lust hat.

OK… nun ein paar nette Groovy beispiele… (ich lass die vergleichende Java codes weg… kennt so und so jeder hier)

Anschnallen - its getting groovy

  1. Das Hello world beispiel
    Jeder kennts und es ist das erste was man überall schreibt… schonmal einen Javaneuling Hello World programmieren lassen… ein einfaches Beispiel und man muss schon Klassen, methoden, static und und und erklären.

Groovy: println 'Hello World !'

kompilieren und freuen.

  1. native unterstützung von listen (oh man das ist groovy)
def list = [1,2,3,4,5]
println list // gibt [1,2,3,4,5] aus
println list[0] // 1
println list[-2] // 4
println list[0..2] // [1,2,3]
// über eine liste iterieren und elemente ausgeben
list.each { println it }
// ok das da oben ist ne sog. closure... dazu später mehr
// die summe aller elemente aus der liste
list.sum() // 15
// jedes element mit * 2
println list.collect { it * 2 } // [2,4,6,8,10]
// alle geraden ermitteln
println list.findAll { it % 2 == 0}

// und und und

das ganze geht auch so ‚pervers‘ für Maps

  1. Closures
    ok die sind a weng komplexer aber eins der besten features von Groovy…
    man kann es als innere Funktion betrachten… Closures sind Codeblocks die an variablen gebunden werden können. Alle closures haben einen default parameter it der genutzt werden kann wenn man selbst keinen angibt.
// ich definiere eine closure die als argumente eine liste und eine weitere closure aufnimmt.
// die closure ruft die parameterclosure auf alle elemente der liste auf
def aMathFunction = { list, closure -> list.collect { closure(it) } }
// elemente der liste werden miteinander multipliziert - auch ne closure
def myFunction_square = { it * it}
// elemente der liste werden miteinander addiert
def myFunction_add = { it + it }

// das ist eine liste....
def myCol = [1,3,5]
// ein element vergessen ?
myCol << 7

// ausgabe [1,9,25,49]
println aMathfunction(myCol, myFunction_square)
// ausgabe [1,6,10,14]
println aMathfunction(myCol, myFunction_add)
  1. Alle text Files eines Verzeichnisses kopieren ?
// für jedes File in 'html/support'
new File("html/support").eachFile { file ->
if(!file.isDirectory()) {
 // schreibe den inhalt des aktuellen files in das neue file
 new File(outDir, file.name).text = file.text
}
}```

4. for schleifen:
```5.times { println "Hallo" }
0.upto(5) { println "Hallo" }
0.step(5,1) { println ""Hallo" }```

5. Systemcalls
```println "ipconfig /all".execute()```

6. Strings
```def text = """ Das ist ein String
und das 
das gehört auch dazu
und und und
"""

def simpleText = "byte-welt ist nicht die Nummer 1"
println simpleText - "nicht "
  1. dynamische Methoden:
 def printX(times) {
     println "X" * times
 }
 
 def printY(times) {
     println "Y" * times
 }
}

def y = "Y"
new T()."print$y"(5) // YYYY
y = "X"
new T()."print$y"(5) // XXXX

UND UND UND… es gibt noch sooooo viel nettes (und auch gefährliches !!) Zeug…

ich liebe es…

NACHTEIL:
Ja es gibt sie…

naja

nennen wir mal n paar

  1. schlechte IDE unterstützung… Plugin für Eclipse ist miserable… refactor, code completion, compile errors/warnings → alles klappt nicht wirklich :frowning:

  2. keine starke Typisierung… man muss nicht den typ angebene… macht manches leichter, aber nicht unbedingt.

So als nächstes wird dann GRAILS angeschaut - Groovy goes webapplication :slight_smile:

Probierts aus… Groovy ist Groovy :slight_smile:

Huhu DBAC! :slight_smile:

Das sieht irgendwie aus wie ne Mischung aus Basic und C++. Kann mich aber auch irren… :smiley:

Debac das könntest du auch ins Wiki packen :wink:

Das Profilbild hat mich schon zu java-forum.org-Zeiten sehr angesprochen :smiley:

[QUOTE=Jango]Huhu DBAC! :slight_smile:

Das sieht irgendwie aus wie ne Mischung aus Basic und C++. Kann mich aber auch irren… :D[/QUOTE]
basic keine ahnung… c++ ne nicht wirklich…

uff - arbeit… äh… wie wo was ?

wiki wollte ich… aber da kann man kein copy & paste machen und muss anders formatieren …

werde ich mal in ner ruhigen minute machen

@dbac: Wenn Du Dich mit Grails beschäftigst wirst Du echt viel Spaß haben, ein sehr sehr geiles Framework.

Gut Schuß
VuuRWerK :wink:

am wochenende mal a weng gemacht… nett :wink:

uh… groovy ist böse.

schon immer gewollt dass die Klasse Integer eine rand methode hat ? mit Java nicht wirklich einfach…

  static int rand(Integer self) {
     return new Random().nextInt(self.intValue())
  }
}

use(RandomHelper) {
  10.times { println 10.rand }
}```
gibt 10 mal zufallszahlen von 0 - 9 aus.... und schwupps hat Integer eine neue Methode...


das ist auch mal nett....
```interface I {
   def foo()
}

class A implements I {
    def value
    
    def foo() {
        println "A with $value"
    }
}

class B implements I {
    def value
    
    def foo() {
        println "B with $value"
    }
}

def map = [ "newA": { new A(value:Math.random()) },
            "newB": { new B(value:Math.random()) }
]

map["newA"]().foo()
map["newA"]().foo()
map["newB"]().foo()

ich unterhalt euch einfach mal weiter :wink:


println "TEST".isIn(["TEST"]) // true
println 2.isIn([1,2,3]) // true
println new Date().isIn([]) // false```

nett... dir fehlt eine methode die eine Klasse schon immer haben sollte ?.... dance groovy und erstell sie dir...

```String.metaClass.count = { String search ->
    delegate.findAll { character -> character == search }.size()
}

println "HELLO".count("H") // 1
println "HELLO".count("L") // 2

herrlich

wollt ihr schon immer java neulinge verwirren:

def t = new String("Hello")

println s == t // true```

groovy machts moeglich :D

na wer findets raus wieso das true wird ?

[QUOTE=deathbyaclown]wollt ihr schon immer java neulinge verwirren:

def t = new String("Hello")

println s == t // true```

groovy machts moeglich :D

na wer findets raus wieso das true wird ?[/QUOTE]

Weil Groovy Operator-Overloading unterstützt! Woohooo :o)
Geht mit allen anderen Operatoren die man kennt auch und sogar noch mehr (bspw. für switch-case-statements): http://groovy.codehaus.org/Operator+Overloading

Gut Schuß
VuuRWerK ;)

Mehr und mehr glaube ich, dass Groovy alles eingebaut hat über dessen Fehlen in Java ich Tag für Tag glücklich bin. :smiley:

Spaß macht’s bestimmt. Aber in einem Projekt mit mehreren Entwicklern möchte ich die Sprache nicht nutzen müssen.

Ebenius

jup… groovy mappt == auf equals - ausnahme es wird Comparable implementiert, dann gewinnt compareTo

gelle ? :wink:

wieso ?

aus implementorischer hinsicht… gefaellt dir die syntax nicht ? fehlende typisierung ? … mach sie doch… groovy == java…

und wenn man ueber schnitstellen seine Sachen definiert is ja egal wie etwas programmiert wird… Metaprogrammierung ist natuerlich ne miese falle…

     static def minus(int self, int other) {  
         self + other;   
     }  
 }  
   
 Integer.mixin DeceptiveIntegerExt   

und schwups schaut 10 - 10 aufeinmal wie 20 aus :wink:

aus technischer hinsicht…

  1. ant → gant (danke danke kein xml gemurkse mehr)
  2. maven → gradle (siehe 1.)
  3. junit → spock (danke danke… endlich kein wirres junit test geplaenkel assert mehr)
  4. jsp/servlets/web applikation → grails (the holy one)

und und und

natuerlich muss sich die Sprache auch noch festigen - ist erst wenige Jahre alt… dennoch ist sie a) auf dem richtigen weg und b) auf dem richtigen weg…

und vor allem da es kompatibel ist zu bestehenden ausgereiften Java code bzw projekten → der tag an dem reines Java fuer mich stirbt ist sehr nah :slight_smile:

Ich mag so Späße wie überladene Operatoren eigentlich nicht. Je mehr Möglichkeiten eine Programmiersprache bietet, desto komplizierter ist es, den Quelltext anderer zu verstehen. Ich weiß nun nicht genau wie Groovy das Überladen der Konstruktoren unterstützt. Aber aus der kurzen Zeit innerhalb derer ich C++ programmiert habe weiß ich, dass ich überladene Operatoren nicht leiden kann. Es ist eine schöne Sache eine Matrixklasse mit allen für Matritzenberechnung notwendigen Operatoren ausstatten zu können. Allerdings bleibt es leider nie bei den sinnvollen und intuitiv greifbaren Operatoren. So werden zum Beispiel die Shift-Operatoren kurzerhand zu Stream-I/O-Operatoren missbraucht. Dadurch erhöht sich das benötigte Seitenwissen um fremden Quelltext verstehen zu können. Der Methodenname „write()“ ist nunmal besser greifbar als „>>“. Hinzu kommt, dass beim Lesen eines solchen Quelltextes nicht von vornherein klar ist, wo ein binärer Operator definiert ist. Er kann sowohl mit dem Typ links des Operators als auch mit dem Typ rechts implementiert sein. Im schönen Fall in beiden. Und am besten auch noch unterschiedlich. a+b != b+a

Und es wird durch solche Konstrukte nicht besser. :wink: [QUOTE=deathbyaclown]String.metaClass.count = { String search -> delegate.findAll { character -> character == search }.size() }[/QUOTE]
Ergo: Mein Spieltrieb sagt: Geil… Ausprobieren. Aber mit fremder Leute Quelltext – am besten über ein paar Jahre gewachsen mit wechselnden Projektmitgliedern – möchte ich nicht arbeiten müssen.

Ebenius

ich stelle fest Ebenius ist nicht groovy genug :smiley:

aber recht haste natuerlich … :wink:

Ich habe ja bitte den königlichen groove. :smiley:

Ebenius

oh yeah…

binary file kopieren…
new File(outDir, file.name).withOutputStream { out -> out.write file.readBytes() }
wobei file das ursprungsfile ist und outdir das zielverzeichnis…

Is ja alles schön und gut … aber was soll einem das ganze Trara eigentlich bringen um diese ominösen (Skript)Sprachen?

trollversuch ?

wieso spracheN? woher Skriptsprache ?

groovy ist eine dynamische Sprache fuer die VM, mit der man programmieren kann - vieles schoener und intuitiver als Java.

mehr nicht. Wie jede andere Sprache kann man sie lernen oder nicht.

aber nach dem wortlaut denk ich doch eher an einen Trollversuch